From 1d77a9f6ff0d8adec7240a593851a9617d13358a Mon Sep 17 00:00:00 2001
From: Euphy <euphy.raliel@rathena.org>
Date: Sat, 15 Feb 2014 21:15:18 -0500
Subject: [PATCH] Added documenation providing an overview of rAthena's source
 code. (credits: @lighta, @aleos89) This is not comprehensive by any means,
 but gives some basic explanation of how rAthena works. Other topics will
 likely be added at a later date.

Signed-off-by: Euphy <euphy.raliel@rathena.org>
---
 doc/source_doc.txt | 432 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 432 insertions(+)
 create mode 100644 doc/source_doc.txt

diff --git a/doc/source_doc.txt b/doc/source_doc.txt
new file mode 100644
index 0000000000..62745fc710
--- /dev/null
+++ b/doc/source_doc.txt
@@ -0,0 +1,432 @@
+//===== rAthena Documentation ================================
+//= Source Documentation
+//===== By: ==================================================
+//= rAthena Dev Team
+//===== Last Updated: ========================================
+//= 20140215
+//===== Description: =========================================
+//= Explanation of source behaviours and structures.
+//============================================================
+
+This file provides basic information about rAthena's source code.
+The format of this file is as follows:
+	1. Glossary
+	2. Intro & Emulation
+	3. Interface and Communications
+	4. Databases and Independence
+	5. Package and Module Purposes
+	6. Nomenclature
+	7. Variable Notes
+	8. Building
+	9. Atcommands & Script Commands
+
+===============
+| 1. Glossary |
+===============
+The following terms will be frequently used throughout this file, so it is
+important to have a thorough understanding of what they are to avoid confusion.
+
+  Term          Description
+  ----          -----------  
+  serv          a program/daemon that runs indefinitely offering a service
+  host          a machine that has one or more servs running
+  command       a request of an action on the server or client
+                (atcommand, script_command, packet_request)
+  interface     a class/module that offers a list of commands
+
+========================
+| 2. Intro & Emulation |
+========================
+rAthena is an emulation of Ragnarok Online, which runs on software known as AEGIS.
+AEGIS is separated into 4 servs:
+
+  Serv       Description
+  ----       -----------
+  account    handles player account information and logins.
+  char       handles character data (persistent information).
+  inter      handles broadcasting across map-serv. [merged into rAthena's char-serv]
+  map        handles all player runtime actions.
+
+These servs are an aggregation of each other:
+  login-serv  =>  1 - * char-serv, 1 - * map-serv
+
+In this case, * is 30. This means that 1 login-serv is able to manage up to
+30 char-serv, which itself can manage up to 30 map-serv. Note that due to these
+aggregations, the login-serv and map-serv never directly communicate with each other.
+
+===================================
+| 3. Interface and Communications |
+===================================
+We have 3 types of communication:
+
+  1. serv <=> serv  (AH,HA,HZ,ZH)
+     This type of server-to-server communication is referred to as "inter-serv" communication.
+
+  2. serv <=> client  (AC,CA,HC,CH,ZC,CZ)
+     This is what our servs send or receive to a player client.
+	
+  3. serv <=> console/terminal
+     This is the only kind of communication which doesn't use packets (currently).
+     It's only done in localhost from console to servs (a way to input args in servs runtime).
+
+The packet notation and structure are well defined in 'doc/packet_struct_notation.txt'.
+
+Note that scripts and atcommands are another kind of interface, as they allow
+users to input data into the serv.
+
+=================================
+| 4. Databases and Independence |
+=================================
+Each server can theoretically be set in a different host with its own databases
+associated (although this is currently broken due to years without documentation).
+In other words, you shouldn't expect to find char-serv data on a map-serv host
+and access it directly, but rather ask the char-serv to fetch it.
+
+The list below details the association of database tables with the servs.
+For real table names, see 'conf/inter_athena.conf'.
+
+  ==============
+  | Login-serv |
+  ==============
+
+  Table                 Contents
+  -----                 --------
+  login_db              all account-related information
+  reg_db                permanent account variables (ex. #CASHPOINTS)
+
+  =============
+  | Char-serv |
+  =============
+
+  Table                 Contents
+  -----                 --------
+  char_db               all char-related information
+  hotkey_db             hotkeys set for each character
+  scdata_db             character status at disconnection
+  cart_db               list of items in each character's cart
+  inventory_db          list of items in each character's inventory
+  charlog_db            char-serv logs
+  storage_db            list of items in each character's storage (Kafra)
+  reg_db                permanent character variables (ex. ADVJOB)
+  skill_db              character learned skill database
+  interlog_db           inter-serv logs
+  memo_db               character Memo_point database 
+  guild_db              guild record (name, master, lv, exp, emblem, etc.)
+  guild_alliance_db     guild relations database (allies, enemies)
+  guild_castle_db       guild owned castle database
+  guild_expulsion_db    guild expulsion logs
+  guild_member_db       guild current member titles and positions
+  guild_skill_db        guild learned skills database
+  guild_position_db     guild positions configuration (names, taxes, rights)
+  guild_storage_db      guild item storage
+  party_db              party record (name, leader, shared_exp, shared_item)
+  pet_db                saved pet objects database
+  friend_db             character friends database
+  mail_db               mail database
+  auction_db            auction database
+  quest_db              character quest realisation database
+  homunculus_db         saved homunculus objects database
+  skill_homunculus_db   homunculus learned skills database
+  mercenary_db          saved mercenary objects database (HP, SP, level, etc.)
+  mercenary_owner_db    character proprietary link to mercenary object save and use stats
+  elemental_db          saved Elemental objects database (HP, SP, FLEE, etc.)
+  ragsrvinfo_db         map-serv rate record (similar to 'conf/battle/drop.conf', possibly a leftover?)
+  skillcooldown_db      character skill cooldowns at disconnection
+  bonus_script_db       character bonus_script at disconnection
+
+  ============
+  | Map-serv |
+  ============
+  Except for mapreg_db, vending_db, and vending_items_db, the other map-serv
+  tables are optional alternatives to TXT databases located in 'db/*.txt'.
+
+  Table                 Contents
+  -----                 --------
+  mapreg_db             permanent map-serv global variables (ex. $agit_result_timer)
+  vending_db            live vendors database (map_pos, aid, shop title, etc.)
+  vending_items_db      items currently being sold by live vendors
+
+  item_db               item database (Pre-Renewal)
+  item_db_re            item database (Renewal)
+  item_db2              item database import (Pre-Renewal)
+  item_db2_re           item database import (Renewal)
+  item_cash_db          cash shop database
+  item_cash_db2         cash shop database (import)
+  mob_db                monster database (Pre-Renewal)
+  mob_db_re             monster database (Renewal)
+  mob_db2               monster database import (Pre-Renewal)
+  mob_db2_re            monster database import (Renewal)
+  mob_skill_db          monster skill database (Pre-Renewal)
+  mob_skill_db_re       monster skill database (Renewal)
+  mob_skill_db2         monster skill database import (Pre-Renewal)
+  mob_skill_db2_re      monster skill database import (Renewal)
+
+==================================
+| 5. Package and Module Purposes |
+==================================
+The following list describes each module and its purpose.
+
+  ============
+  | 3rdparty |
+  ============
+  The '3rdparty/' folder contains libraries used by the project but are not maintained by us.
+
+  ==========
+  | Common |
+  ==========
+  The 'src/common' folder contains all the modules which are used by more then 1 serv.
+
+  Module         Description
+  ------         -----------
+  atomic         adapter to atomic operations for Windows API
+  cbasetypes     adapter to OS and arch specification (function name, bit representation)
+  cli            console Line Interface handling (get arguments from terminal at beginning and runtime) 
+  conf           facade of libconfig api
+  core           MAIN program entry (initialization of each serv starts here)
+  db             database module (create, parse, and destroy databases)
+  des            Data Encryption Standard algorithm modified for rAthena
+  ers            Entry Reusage System to help memory allocation
+  evdp           handles events
+  grfio          handles *.grf files (searches for files in them and decodes them)
+  malloc         handles runtime memory allocation (so that memory manager could check for leaks)
+  mapindex       handles the processing and reading of the mapcache.dat
+  md5calc        offers md5 encryption
+  mempool        handles shared memory pool for thread support
+  mmo.h          common structures and defines across serv
+  msg_conf       handles msg in src from configuration
+  mutex          handles Mutual exclusion (Mutex) for thread support
+  netbuffer      iobuffer initialisation for thread support
+  network        updated socket module, with ipv6 and thread support
+  nullpo         checks and dumps info for debug mode
+  raconf         processes the conf files
+  random         generation of random numbers
+  showmsg        display messages in console with a certain color
+  socket         handling of sockets (listening, close, open, etc.)
+  spinlock       handles synchronization (waiting loop) for thread support
+  sql.c          MySQL database proxy
+  strlib.c       string handling
+  thread.c       thread creation and destruction
+  timer.c        timer-related functions
+  utils.c        misc functions
+  winapi.h       Windows redefine and include
+
+  ==============
+  | Login-serv |
+  ==============
+
+  Module         Description
+  ------         -----------
+  account        persistence for account data
+  ipban          offers IP banishment
+  login          main module of login-serv
+  loginlog       records all operations into log for login-serv
+
+  =============
+  | Char-serv |
+  =============
+  The char-serv is responsible for persistence (save/load data permanently) and
+  also serves as a controller that handles all associated map-servs. Further, it
+  is responsible for ensuring that there are no duplicate party names among the
+  map-servs (which could create conflicts if a party transfers map-servs).
+
+  Module             Description
+  ------             -----------
+  char               currently holds all the char-serv (EA) process
+  inter              main entry to inter-serv; delegates packet handling to submodules
+  -- int_auction     handles auction request and saving
+  -- int_elemental   handles elemental data (BL_ELE => Sorcerer mob)
+  -- int_guild       handles guild data (creation, destruction, add member, etc.)
+  -- int_homun       handles homunculus data (BL_HOM => Alchemist mob)
+  -- int_mail        handles mail data
+  -- int_mercenary   handles mercenary data (BL_MER => All class mob)
+  -- int_party       handles party data (creation, destruction, add member, etc.)
+  -- int_pet         handles pet data (BL_PET => All class mob)
+  -- int_quest       handles quest data
+  -- int_storage     handles storage data (save storage, load storage, etc.)
+
+  ============
+  | Map-serv |
+  ============
+
+  Module         Description
+  ------         -----------
+  atcommand      handles GM commands (ex. @who)
+  battle         handles damage calculation where target is enemy and battle configuration settings
+  battleground   functions for Battleground system (create, destroy, messaging, join, etc.)
+  buyingstore    functions for player Buying Stores (create, search, sell)
+  cashshop       functions to set up the server cashshop (from cashshop_db), and contains function to buy items from cashshop
+  channel        functions for the channel system (create, delete, join/auto-join, leave, broadcast, alter options)
+  chat           functions for the chatroom system (create, delete, trigger chatroom_event, change owner, etc.)
+  chrif          char-serv <=> map-serv connections interface (send and receive packets to char-serv)
+  clif           client <=> map-serv connections interface (send and receive packets to/from client)
+  date           functions for time
+  duel           functions for the duel system
+  elemental      functions for Sorcerer Elementals processing (create, delete, etc.)
+  guild          functions for the guild system
+  homunculus     functions for Alchemist Homunculi processing (create, delete, get stats, death, etc.)
+  instance       functions for instance system
+  intif          map-serv <=> inter-serv interface (meant to communicate with 'char/inter.c' or its submodules)
+  itemdb         functions for the item database
+  log            functions for server log system
+  mail           functions for mail system
+  map            map-serv main module, and a representation of a map object
+                   adds or removes other objects into map (blocklist) and provides iterators (ex. map_foreachpc)
+  mapreg         functions to save or read variables in mapreg_db (global variables for all map-serv)
+  mercenary      functions for Mercenary system (create, search, get stats, dead)
+  mob            functions for mob data, structures, and mob routines
+  npc            functions for NPC data (create, delete, calling NPCs)
+  npc_chat       functions for PCRE and NPC interaction
+  party          functions for the party system (create, join, delete, alter options, etc.)
+  path           functions for path finding (check_distance, search path unit will use)
+  pc             functions for player processing (loot/drop/delete items, player bonus handling, player dead, etc.)
+  pc_groups      functions for players groups system (manage player permissions and atcommand access)
+  pet            functions for the pet system (similar to mercenary, homunculus, player, etc.)
+  quest          functions for the quest log system (add, complete, remove, etc.) 
+  script         handles script language logic (used in NPC scripts), script commands, and mapflags
+  searchstore    functions for the Vendor Shop Search feature
+  skill          functions for skills (skill_casttime calculation, skill behaviours, skill_chk_cast, requirement checks, 'db/skill_*.txt' processing)
+  status         functions for statuses on a bl (add, remove, calculation of effects as a temporary bonus)
+                   status is a struct available by most units as common attributes (bl_type only attribute are dealt in bl specific files, like 'pc.c' or 'mob.c')
+  storage        functions for the storage system: Kafra, cart, guild, inventory (add, transfer, remove items between containers)
+                   also ensures container mutex (e.g. guild_storage) and preparation for save requests
+  trade          functions to perform a trade (request, accept, add items/Zeny, checks, complete trade)
+  unit           functions for controlling player/mob/NPC actions (walk, follow, skill use)
+  vending        functions for Merchant Vending (create, purchase)
+
+===================
+| 6. Nomenclature |
+===================
+The following are standard naming conventions used by rAthena.
+
+  Type        Prefix         Example
+  ----        ------         -------
+  function    module_        pc_addspiritball -> located in pc.c file
+  structure   s_             s_quest_db
+  enum        e_             e_race
+  status      SC_            SC_INTOABYSS
+  skill       classmid_      AL_TELEPORT -> AL = Acolyte
+  bonus       SP_            SP_ATK_RATE
+
+NOTES:
+  - If a status name conflicts with a skill name, another '_' is added (e.g. SC__WEAKNESS).
+  - All constants should be written in all caps.
+  - battle_config vs. #define macro:
+        battle_config can be changed during runtime (ex. @setbattleflag), but this requires
+        more processing and could render the server less stable than a macro would.
+
+=====================
+| 7. Variable Notes |
+=====================
+The following variables are commonly used in the source code.
+
+  Variable   Full Name            Description
+  --------   ---------            -----------
+  sd         session data         represents the session of a client into a serv (login, char, or map)
+  tsd        target sd            same as sd, but for a target
+  pl_sd                           usually in an iteration loop, the current sd of index
+  it_sd                           a variant of pl_sd (for iter_sd)
+  fd         file descriptor      a link to an I/O like a socket or file
+  md         mob data             represents monster information; also used to represent mercenary information
+  hd         homunculus data      represents homunculus information
+  nd         NPC data             represents NPC information
+  ed         elemental data       represents elemental information
+  pd         pet data             represents pet information
+  sc         status change        a structure containing all the possible status applied to a character
+  tsc        target sc            same as sc, but for a target
+  sce        status change entry  represents data of a specific inflicted status
+  bl         blocklist            common data of one object (a skill, pet, player, etc); also represents a 2-way chain-link
+  tbl        target bl            same as bl, but for a target
+  st         script stack         the stack of an NPC
+  aid        account id           a player account ID
+  gid        game id              the general unique ID of a Unit, which is the aid for players
+                                  (since a single character per account can be connected at one time)
+  cid        character id         a player character ID
+  rid        character id         a variant of cid
+  su         skill unit           a skill with a unit that remains on the ground
+
+===============
+| 8. Building |
+===============
+When adding a new src file or library (new.c and its header, new.h), you'll also
+need to update the following files to fully integrate it into the project so that
+users can compile it.
+
+There are 3 ways to compile the project:
+
+> configure + makefile (requires POSIX environment + C compiler)
+  This flow is mainly used by Linux users, but can be done in any POSIX environment (ex. Windows + Cygwin).
+  - Configure.in: Template file to generate the configure script by autoconf.
+  - Makefile.in: Template makefile to generate the real makefile according to configure. Each subfolder needs its own makefile.
+  - Makefile: File filled with rules for gcc to compile folder.
+  The sequence is as follows:
+	1) configure.in => configure by autoconf ('autoconf configure.in > configure')
+	2) configure    => Makefile by Makefile.in
+	3) Makefile     => binary by 'make all' or alternative
+
+> cmake (requires C compiler + cmake)
+  - CmakeList: Comparable to Makefile, but in a more cross-OS way.
+  The sequence is as follows:
+	1) Define which toolchain to use, acting like a configure ('cmake -G "Unix Makefiles"' or 'cmake -G "Visual Studio 10"')
+	2) Enter the build folder where the Makefiles are generated and launch 'make install' to produce binaries from them
+
+> sln (requires Visual Studio)
+  - *.sln: Solution project for Visual Studio (Windows).
+
+See http://rathena.org/wiki/Compiling for more detailed compilation instructions.
+
+===================================
+| 9. Atcommands & Script Commands |
+===================================
+To implement an atcommand or script command, you must define a function and
+add its reference to the appropriate array. See the files in 'src/custom/'
+for examples.
+
+Atcommands
+----------
+	ACMD_FUNC(name)
+	{
+		<code>
+	}
+
+	ACMD_DEF(name)  - OR -  ACMD_DEFR(name,restriction)
+	  - OR -
+	ACMD_DEF2("alias",name)  - OR -  ACMD_DEF2R("alias",name,restriction)
+
+  Restriction    Description
+  -----------    -----------
+      1          restrict usage in console
+      2          restrict usage in script_command
+
+Script Commands
+---------------
+	BUILDIN_FUNC(name)
+	{
+		<code>
+	}
+
+	BUILDIN_DEF(name,"arguments")
+	  - OR -
+	BUILDIN_DEF2(name,"alias","arguments")
+
+  Argument    Description
+  --------    -----------
+     i        integer
+     s        string
+     v        variable
+     l        label
+     r        reference (of a variable)
+     ?        optional parameter (one)
+     *        optional parameter (unknown count)
+              null (no arguments)
+
+Useful functions:
+  script_hasdata(st,i);       // Returns if the stack contains data at the target index
+  script_getdata(st,i);       // Returns the script_data at the target index (data is a glob type)
+  script_getnum(st,val);      // Returns the int at the target index
+  script_getstr(st,val);      // Returns the string at the target index
+  script_getref(st,val);      // Returns the reference of a variable at the target index (useful for arrays, ex. 'checkweight2')
+  script_getfuncname(st);     // Returns the current function name (useful for function variants, ex. 'sc_start')
+  script_pushint(st,val);     // Pushes an int into the stack
+  script_pushstr(st,val);     // Pushes a string into the stack
+  script_isstring(st,i);      // Returns if the data at at the target index is a string
+  script_isint(st,i);         // Returns if the data at at the target index is an int