• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Any chance of commercial license?

saulosneto

New Member
Joined
Aug 15, 2013
Messages
4
Reaction score
0
Hello.

I'm looking for a possible commercial license for use TFS like a engine for a MMORPG project.
For the team: It's possible to negotiate the source-code for a commercial game like Tibia? Not the "New Tibia"... but, a new MMORPG experience totally in brazilian portuguese with logical quests and good-sense/team-sense interaction, under legal licenses and brazilian-theme environment.

Att, Saulo Neto .·.
Prismma
 
As far as I know, TFS is under a GNU general public license.
In other words, do whatever the hell you wish.

Note: I may be totally wrong, I'm not a lawyer.
 
No, using the open client or a new client. We want to make a game without Official Tibia relations. A game with all legal burocracy of our country.
 
No, using the open client or a new client. We want to make a game without Official Tibia relations. A game with all legal burocracy of our country.
In this case you (and your company) have to use custom sprites because as far I know all files of Tibia Client are under license.


_
Regards,
sn3ejk
 
As far as I know, TFS is under a GNU general public license.
In other words, do whatever the hell you wish.

Note: I may be totally wrong, I'm not a lawyer.

Yeah, i read the license but you can do whatever the hell you wish if your game is forever free (i understand this, and my lawyer too). We want a free game with paid premmium account and some publish on site...for this, we need try to make possible business with team for a legal agreement of codes for engine mode use in our project.

- - - Updated - - -

In this case you (and your company) have to use custom sprites because as far I know all files of Tibia Client are under license.


_
Regards,
sn3ejk

Yes, we can't have any sprite of Tibia, one sprite of Tibia and CipSoft make me cry.
 
If you can write a client then you can surely write an engine. And btw you have a crappy lawyer if you still need to ask questions about this here. :p
 
My lawyer is my dad, i maked a quickly question for him. I don't want write a 9 years project alone, i want buy the license or the code and create only sprites, quests, etc.. because don't have time/programming experience for make all the code... thanks for replys.
 
Well, you can change all sprites, something else. But for really make a commercial mmorpg - that is wrong way...
Anyone here have .dat source code? But you can re-make it too, for example to XML or another format. So, that's alot of work. (++ develop you own software for that), Change graphics... game-mechanics... Hmmm... How i understand you are have a team right? Better way - create you own game from dev//null by using some from TFS/Tibia. Create a engine - that is only 5% of totally work for mmorpg. And that 5% is very simple. Well, what is primary in client side? Right - collisions. Something like that:

Code:
#include "collisions.h"

/**
 * Checks whether or not two sprites collide.
 *
 * This function does pixel perfect checks.  If the collision actually occurs,
 *  crash is set to store the real position of the collision.
 *
 *    @param[in] at Texture a.
 *    @param[in] asx Position of x of sprite a.
 *    @param[in] asy Position of y of sprite a.
 *    @param[in] ap Position in space of sprite a.
 *    @param[in] bt Texture b.
 *    @param[in] bsx Position of x of sprite b.
 *    @param[in] bsy Position of y of sprite b.
 *    @param[in] bp Position in space of sprite b.
 *    @param[out] crash Actual position of the collision (only set on collision).
 *    @return 1 on collision, 0 else.
 */
int CollideHappySprite( const glTexture* at, const int asx, const int asy, const Vector2d* ap,
      const glTexture* bt, const int bsx, const int bsy, const Vector2d* bp,
      Vector2d* crash )
{
   int x,y;
   int ax1,ax2, ay1,ay2;
   int bx1,bx2, by1,by2;
   int inter_x0, inter_x1, inter_y0, inter_y1;
   int rasy, rbsy;
   int abx,aby, bbx, bby;

#if DEBUGGING
   /* Make sure the surfaces have transparency maps. */
   if (at->trans == NULL) {
      WARN("Texture '%s' has no transparency map.", at->name);
      return 0;
   }
   if (bt->trans == NULL) {
      WARN("Texture '%s' has no transparency map.", bt->name);
      return 0;
   }
#endif /* DEBUGGING */

   /* a - cube coordinates */
   ax1 = (int)VX(*ap) - (int)(at->sw)/2;
   ay1 = (int)VY(*ap) - (int)(at->sh)/2;
   ax2 = ax1 + (int)(at->sw) - 1;
   ay2 = ay1 + (int)(at->sh) - 1;

   /* b - cube coordinates */
   bx1 = (int)VX(*bp) - (int)(bt->sw)/2;
   by1 = (int)VY(*bp) - (int)(bt->sh)/2;
   bx2 = bx1 + bt->sw - 1;
   by2 = by1 + bt->sh - 1;

   /* check if bounding boxes intersect */
   if((bx2 < ax1) || (ax2 < bx1)) return 0;
   if((by2 < ay1) || (ay2 < by1)) return 0;

   /* define the remaining binding box */
   inter_x0 = MAX( ax1, bx1 );
   inter_x1 = MIN( ax2, bx2 );
   inter_y0 = MAX( ay1, by1 );
   inter_y1 = MIN( ay2, by2 );

   /* real vertical sprite value (flipped) */
   rasy = at->sy - asy - 1;
   rbsy = bt->sy - bsy - 1;

   /* set up the base points */
   abx =  asx*(int)(at->sw) - ax1;
   aby = rasy*(int)(at->sh) - ay1;
   bbx =  bsx*(int)(bt->sw) - bx1;
   bby = rbsy*(int)(bt->sh) - by1;

   for (y=inter_y0; y<=inter_y1; y++)
      for (x=inter_x0; x<=inter_x1; x++)
         /* compute offsets for surface before pass to TransparentPixel test */
         if ((!gl_isTrans(at, abx + x, aby + y)) &&
               (!gl_isTrans(bt, bbx + x, bby + y))) {

            /* Set the crash position. */
            crash->x = x;
            crash->y = y;
            return 1;
         }

   return 0;
}


/**
 *Checks to see if two lines collide.
 *
 *    @param[in] s1x X start point of line 1.
 *    @param[in] s1y Y start point of line 1.
 *    @param[in] e1x X end point of line 1.
 *    @param[in] e1y Y end point of line 1.
 *    @param[in] s2x X start point of line 2.
 *    @param[in] s2y Y start point of line 2.
 *    @param[in] e2x X end point of line 2.
 *    @param[in] e2y Y end point of line 2.
 *    @param[out] crash Position of the collision.
 *    @return 3 if lines are coincident, 2 if lines are parallel,
 *              1 if lines just collide on a point, or 0 if they don't.
 */
int CollideHappyLineLine( double s1x, double s1y, double e1x, double e1y,
      double s2x, double s2y, double e2x, double e2y, Vector2d* crash )
{
   double ua_t, ub_t, u_b;
   double ua, ub;

   ua_t = (e2x - s2x) * (s1y - s2y) - (e2y - s2y) * (s1x - s2x);
   ub_t = (e1x - s1x) * (s1y - s2y) - (e1y - s1y) * (s1x - s2x);
   u_b  = (e2y - s2y) * (e1x - s1x) - (e2x - s2x) * (e1y - s1y);

   if (u_b != 0.) {
      ua = ua_t / u_b;
      ub = ub_t / u_b;

      /* Intersection at a point. */
      if ((0. <= ua) && (ua <= 1.) && (0. <= ub) && (ub <= 1.)) {
         crash->x = s1x + ua * (e1x - s1x);
         crash->y = s1y + ua * (e1y - s1y);
         return 1;
      }
      /* No intersection. */
      else
         return 0;
   }
   else {
      /* Coincident. */
      if ((ua_t == 0.) || (ub_t == 0.))
         return 3;
      /* Parallel. */
      else
         return 2;
   }
}


/**
 * @brief Checks to see if a line collides with a sprite.
 *
 * First collisions are detected on all the walls of the sprite's rectangle.
 *  Then the collisions are tested by pixel perfectness until collisions are
 *  actually found with the ship itself.
 *
 *    @param[in] ap Origin of the line.
 *    @param[in] ad Direction of the line.
 *    @param[in] al Length of the line.
 *    @param[in] bt Texture b.
 *    @param[in] bsx Position of x of sprite b.
 *    @param[in] bsy Position of y of sprite b.
 *    @param[in] bp Position in space of sprite b.
 *    @param[out] crash Position of the collision.
 *    @return 1 on collision, 0 else.
 *
 * @sa CollideHappySprite
 */
int CollideHappyLineSprite( const Vector2d* ap, double ad, double al,
      const glTexture* bt, const int bsx, const int bsy, const Vector2d* bp,
      Vector2d crash[2] )
{
   int x,y, rbsy, bbx,bby;
   double ep[2], bl[2], tr[2], v[2], mod;
   int hits, real_hits;
   Vector2d tmp_crash, border[2];

   /* Make sure texture has transparency map. */
   if (bt->trans == NULL) {
      WARN("Texture '%s' has no transparency map.", bt->name);
      return 0;
   }

   /* Set up end point of line. */
   ep[0] = ap->x + al*cos(ad);
   ep[1] = ap->y + al*sin(ad);

   /* Set up top right corner of the rectangle. */
   tr[0] = bp->x + bt->sw/2.;
   tr[1] = bp->y + bt->sh/2.;
   /* Set up bottom left corner of the rectangle. */
   bl[0] = bp->x - bt->sw/2.;
   bl[1] = bp->y - bt->sh/2.;

   /*
    * Start check for rectangular collisions.
    */
   hits = 0;
   /* Left border. */
   if (CollideHappyLineLine(ap->x, ap->y, ep[0], ep[1],
         bl[0], bl[1], bl[0], tr[1], &tmp_crash) == 1) {
      border[hits].x = tmp_crash.x;
      border[hits].y = tmp_crash.y;
      hits++;
   }
   /* Top border. */
   if (CollideHappyLineLine(ap->x, ap->y, ep[0], ep[1],
         bl[0], tr[1], tr[0], tr[1], &tmp_crash) == 1) {
      border[hits].x = tmp_crash.x;
      border[hits].y = tmp_crash.y;
      hits++;
   }
   /* Now we have to make sure hits isn't 2. */
   /* Right border. */
   if ((hits < 2) && CollideHappyLineLine(ap->x, ap->y, ep[0], ep[1],
         tr[0], tr[1], tr[0], bl[1], &tmp_crash) == 1) {
      border[hits].x = tmp_crash.x;
      border[hits].y = tmp_crash.y;
      hits++;
   }
   /* Bottom border. */
   if ((hits < 2) && CollideHappyLineLine(ap->x, ap->y, ep[0], ep[1],
         tr[0], bl[1], bl[0], bl[1], &tmp_crash) == 1) {
      border[hits].x = tmp_crash.x;
      border[hits].y = tmp_crash.y;
      hits++;
   }

   /* No hits - missed. */
   if (hits == 0)
      return 0;

   /* Beam must die in the rectangle. */
   if (hits == 1) {
      border[1].x = ep[0];
      border[1].y = ep[1];
   }

   /*
    * Now we do a pixel perfect approach.
    */
   real_hits = 0;
   /* Directionality vector (normalized). */
   v[0] = border[1].x - border[0].x;
   v[1] = border[1].y - border[0].y;
   /* Normalize. */
   mod = MOD(v[0],v[1])/2.; /* Multiply by two to reduce check amount. */
   v[0] /= mod;
   v[1] /= mod;

   /* real vertical sprite value (flipped) */
   rbsy = bt->sy - bsy - 1;
   /* set up the base points */
   bbx =  bsx*(int)(bt->sw);
   bby = rbsy*(int)(bt->sh);

   /* We start checking first border until we find collision. */
   x = border[0].x - bl[0] + v[0];
   y = border[0].y - bl[1] + v[1];
   while ((x > 0.) && (x < bt->sw) && (y > 0.) && (y < bt->sh)) {
      /* Is non-transparent. */
      if (!gl_isTrans(bt, bbx+(int)x, bby+(int)y)) {
         crash[real_hits].x = x + bl[0];
         crash[real_hits].y = y + bl[1];
         real_hits++;
         break;
      }
      x += v[0];
      y += v[1];
   }

   /* Now we check the second border. */
   x = border[1].x - bl[0] - v[0];
   y = border[1].y - bl[1] - v[1];
   while ((x > 0.) && (x < bt->sw) && (y > 0.) && (y < bt->sh)) {
      /* Is non-transparent. */
      if (!gl_isTrans(bt, bbx+(int)x, bby+(int)y)) {
         crash[real_hits].x = x + bl[0];
         crash[real_hits].y = y + bl[1];
         real_hits++;
         break;
      }
      x -= v[0];
      y -= v[1];
   }

   /* Actually missed. */
   if (real_hits == 0)
      return 0;

   /* Strange situation, should never happen but just in case we duplicate
    *  the hit. */
   if (real_hits == 1) {
      crash[1].x = crash[0].x;
      crash[1].y = crash[0].y;
   }

   /* We hit. */
   return 1;
}
So, that is primary part of game-client. For example, for sprites you may use OpenGL, and some resource loaders. They have a very simple code too. Next - Protocol - you may saw TFS protocol algorithm and basic things. With map - similar. Totally, all of that costs a ~2 months of you time (and you spend more time than code it from null, if you start adapt tfs code for you game design concept model) Server-side, can be coded easy too (basic things.) But primary & Generally - it is a Game Content - they waste a large amounts of you time. Ask yourself - "What is better way, code - step by step (with looking how ~that thing coded in tfs and make similar) my own game, or spend much more time for re-write TFS "engine" and that game never be licensed by me... "

Yeah, sad but true - you never make it as commercial software by many things. (Ok, you make a ALL sprites to you own... but, how about .spr file, .dat file? =) If you want a commercial game - you should re-make them too =) And that impossible without serious changes in "engine"...)
 
It is possible, yes. Depending on what type of patent / copyright CipSoft has on Tibia and how far it extends, you may be able to own and host an identical game.

A "Copyright" is a legal concept, enacted by most governments, giving the creator of an original work exclusive rights to it, usually for a limited time. Copyrights are said to be territorial, which means that they do not extend beyond the territory of a specific state unless that state is a party to an international agreement.

In other words, along with the GNU General Public License, you may be able to make an exact copy of Tibia and host it for profit without any interference of the law.
 
Back
Top