From a2306446c86b3333e69b082e41ae76ba71a42d9d Mon Sep 17 00:00:00 2001
From: Ben Longbons <b.r.longbons@gmail.com>
Date: Thu, 24 Mar 2011 13:57:13 -0700
Subject: Optimize common objects, and adjust other objects accordingly. Major
 changes still need to be made to each of the servers.

---
 src/char/Makefile                  |    4 +-
 src/char/char.c                    |  302 ++++-----
 src/char/int_guild.c               |   62 +-
 src/char/int_party.c               |   33 +-
 src/char/int_storage.c             |   46 +-
 src/char/inter.c                   |   52 +-
 src/common/Makefile                |    3 +-
 src/common/core.c                  |  132 +---
 src/common/core.h                  |   23 +-
 src/common/db.c                    |  424 ++++++-------
 src/common/db.h                    |  102 +++-
 src/common/grfio.c                 | 1189 ++++--------------------------------
 src/common/grfio.h                 |   29 +-
 src/common/lock.c                  |   27 +-
 src/common/lock.h                  |   11 +-
 src/common/malloc.c                |   68 ---
 src/common/malloc.h                |   27 -
 src/common/md5calc.c               |  505 ++++++++-------
 src/common/md5calc.h               |   67 +-
 src/common/mmo.h                   |  125 ++--
 src/common/mt_rand.c               |   86 ++-
 src/common/mt_rand.h               |   26 +-
 src/common/nullpo.c                |   56 +-
 src/common/nullpo.h                |  254 ++------
 src/common/sanity.h                |   36 ++
 src/common/socket.c                |  420 +++++--------
 src/common/socket.h                |  197 +++---
 src/common/timer.c                 |  328 ++++------
 src/common/timer.h                 |   86 ++-
 src/common/utils.c                 |  121 ----
 src/common/utils.h                 |   49 +-
 src/common/version.h               |   43 +-
 src/ladmin/Makefile                |    4 +-
 src/ladmin/ladmin.c                |   86 ++-
 src/login/Makefile                 |    4 +-
 src/login/login.c                  |  336 +++++-----
 src/map/Makefile                   |    4 +-
 src/map/atcommand.c                |   29 +-
 src/map/battle.c                   |   26 +-
 src/map/chat.c                     |    5 +-
 src/map/chrif.c                    |   33 +-
 src/map/clif.c                     |   56 +-
 src/map/clif.h                     |    2 +-
 src/map/guild.c                    |   77 +--
 src/map/itemdb.c                   |   26 +-
 src/map/magic-expr.c               |    5 +-
 src/map/magic-interpreter-base.c   |   11 +-
 src/map/magic-interpreter-parser.y |   14 +-
 src/map/magic-interpreter.h        |    1 -
 src/map/magic-stmt.c               |   31 +-
 src/map/map.c                      |  125 ++--
 src/map/map.h                      |    6 +-
 src/map/mob.c                      |  183 +++---
 src/map/mob.h                      |    8 +-
 src/map/npc.c                      |  215 +++----
 src/map/npc.h                      |    2 +-
 src/map/party.c                    |   26 +-
 src/map/pc.c                       |  125 ++--
 src/map/pc.h                       |   10 +-
 src/map/script.c                   |  125 ++--
 src/map/skill-pools.c              |    2 +-
 src/map/skill.c                    |  225 ++++---
 src/map/skill.h                    |    4 +-
 src/map/storage.c                  |   20 +-
 src/map/tmw.c                      |    3 +-
 src/tool/Makefile                  |   10 +-
 src/tool/eathena-monitor.c         |    6 +-
 src/tool/itemfrob.c                |    7 +-
 src/tool/mapfrob.c                 |    7 +-
 src/tool/marriage-info.c           |    6 +-
 src/tool/moneycount/mmo.h          |   15 -
 src/tool/skillfrob.c               |    5 -
 72 files changed, 2377 insertions(+), 4441 deletions(-)
 delete mode 100644 src/common/malloc.c
 delete mode 100644 src/common/malloc.h
 create mode 100644 src/common/sanity.h
 delete mode 100644 src/common/utils.c

(limited to 'src')

diff --git a/src/char/Makefile b/src/char/Makefile
index 308747d..c448627 100644
--- a/src/char/Makefile
+++ b/src/char/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
 
 all: char
 
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/mt_rand.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/mt_rand.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/mt_rand.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/mt_rand.h
 char: char.o inter.o int_party.o int_guild.o int_storage.o $(COMMON_OBJ)
 
 char.o: char.c char.h inter.h $(COMMON_H) ../common/version.h
diff --git a/src/char/char.c b/src/char/char.c
index 5ac11d4..d340f1d 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -199,7 +199,7 @@ int search_character_index (char *character_name)
     for (i = 0; i < char_num; i++)
     {
         // Without case sensitive check (increase the number of similar character names found)
-        if (stricmp (char_dat[i].name, character_name) == 0)
+        if (strcasecmp (char_dat[i].name, character_name) == 0)
         {
             // Strict comparison (if found, we finish the function immediatly with correct value)
             if (strcmp (char_dat[i].name, character_name) == 0)
@@ -427,7 +427,7 @@ int mmo_char_fromstr (char *str, struct mmo_charstatus *p)
         }
     }
 
-    if (strcmpi (wisp_server_name, p->name) == 0)
+    if (strcasecmp (wisp_server_name, p->name) == 0)
     {
         printf
             ("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
@@ -592,18 +592,8 @@ int mmo_char_init (void)
     FILE *fp;
 
     char_max = 256;
-    char_dat = calloc (sizeof (struct mmo_charstatus) * 256, 1);
-    if (!char_dat)
-    {
-        printf ("out of memory: mmo_char_init (calloc of char_dat).\n");
-        exit (1);
-    }
-    online_chars = calloc (sizeof (int) * 256, 1);
-    if (!online_chars)
-    {
-        printf ("out of memory: mmo_char_init (calloc of online_chars).\n");
-        exit (1);
-    }
+    CREATE (char_dat, struct mmo_charstatus, 256);
+    CREATE (online_chars, int, 256);
     for (i = 0; i < char_max; i++)
         online_chars[i] = -1;
 
@@ -640,27 +630,8 @@ int mmo_char_init (void)
         if (char_num >= char_max)
         {
             char_max += 256;
-            char_dat =
-                realloc (char_dat, sizeof (struct mmo_charstatus) * char_max);
-            if (!char_dat)
-            {
-                printf
-                    ("Out of memory: mmo_char_init (realloc of char_dat).\n");
-                char_log
-                    ("Out of memory: mmo_char_init (realloc of char_dat)."
-                     RETCODE);
-                exit (1);
-            }
-            online_chars = realloc (online_chars, sizeof (int) * char_max);
-            if (!online_chars)
-            {
-                printf
-                    ("Out of memory: mmo_char_init (realloc of online_chars).\n");
-                char_log
-                    ("Out of memory: mmo_char_init (realloc of online_chars)."
-                     RETCODE);
-                exit (1);
-            }
+            RECREATE (char_dat, struct mmo_charstatus, char_max);
+            RECREATE (online_chars, int, char_max);
             for (i = char_max - 256; i < char_max; i++)
                 online_chars[i] = -1;
         }
@@ -829,7 +800,7 @@ void mmo_char_sync (void)
 //----------------------------------------------------
 // Function to save (in a periodic way) datas in files
 //----------------------------------------------------
-int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
+void mmo_char_sync_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     if (pid != 0)
     {
@@ -839,14 +810,14 @@ int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
         // Need to check status too?
         if (temp == 0)
         {
-            return 0;
+            return;
         }
     }
 
     // This can take a lot of time. Fork a child to handle the work and return at once
     // If we're unable to fork just continue running the function normally
     if ((pid = fork ()) > 0)
-        return 0;
+        return;
 
     mmo_char_sync ();
     inter_save ();
@@ -854,8 +825,6 @@ int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
     // If we're a child we should suicide now.
     if (pid == 0)
         _exit (0);
-
-    return 0;
 }
 
 //----------------------------------------------------
@@ -972,7 +941,7 @@ int make_new_char (int fd, unsigned char *dat)
     {
         if ((name_ignoring_case != 0 && strcmp (char_dat[i].name, dat) == 0)
             || (name_ignoring_case == 0
-                && strcmpi (char_dat[i].name, dat) == 0))
+                && strcasecmp (char_dat[i].name, dat) == 0))
         {
             char_log
                 ("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d."
@@ -1009,25 +978,8 @@ int make_new_char (int fd, unsigned char *dat)
     if (char_num >= char_max)
     {
         char_max += 256;
-        char_dat =
-            realloc (char_dat, sizeof (struct mmo_charstatus) * char_max);
-        if (!char_dat)
-        {
-            printf ("Out of memory: make_new_char (realloc of char_dat).\n");
-            char_log ("Out of memory: make_new_char (realloc of char_dat)."
-                      RETCODE);
-            exit (1);
-        }
-        online_chars = realloc (online_chars, sizeof (int) * char_max);
-        if (!online_chars)
-        {
-            printf
-                ("Out of memory: make_new_char (realloc of online_chars).\n");
-            char_log
-                ("Out of memory: make_new_char (realloc of online_chars)."
-                 RETCODE);
-            exit (1);
-        }
+        RECREATE (char_dat, struct mmo_charstatus, char_max);
+        RECREATE (online_chars, int, char_max);
         for (j = char_max - 256; j < char_max; j++)
             online_chars[j] = -1;
     }
@@ -1282,9 +1234,9 @@ void create_online_files (void)
                 {
                     char *p_name = char_dat[i].name;    //speed up sorting when there are a lot of players. But very rarely players have same name.
                     for (j = 0; j < players; j++)
-                        if (stricmp (p_name, char_dat[id[j]].name) < 0 ||
+                        if (strcasecmp (p_name, char_dat[id[j]].name) < 0 ||
                             // if same name, we sort with case sensitive.
-                            (stricmp (p_name, char_dat[id[j]].name) == 0 &&
+                            (strcasecmp (p_name, char_dat[id[j]].name) == 0 &&
                              strcmp (p_name, char_dat[id[j]].name) < 0))
                         {
                             for (k = players; k > j; k--)
@@ -1299,7 +1251,7 @@ void create_online_files (void)
                         if (char_dat[i].zeny < char_dat[id[j]].zeny ||
                             // if same number of zenys, we sort by name.
                             (char_dat[i].zeny == char_dat[id[j]].zeny &&
-                             stricmp (char_dat[i].name,
+                             strcasecmp (char_dat[i].name,
                                       char_dat[id[j]].name) < 0))
                         {
                             for (k = players; k > j; k--)
@@ -1348,10 +1300,10 @@ void create_online_files (void)
                 {
                     int  cpm_result;    // A lot of player maps are identical. So, test if done often twice.
                     for (j = 0; j < players; j++)
-                        if ((cpm_result = strcmp (char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 ||   // no map are identical and with upper cases (not use stricmp)
+                        if ((cpm_result = strcmp (char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 ||   // no map are identical and with upper cases (not use strcasecmp)
                             // if same map name, we sort by name.
                             (cpm_result == 0 &&
-                             stricmp (char_dat[i].name,
+                             strcasecmp (char_dat[i].name,
                                       char_dat[id[j]].name) < 0))
                         {
                             for (k = players; k > j; k--)
@@ -1876,7 +1828,7 @@ static int char_delete (struct mmo_charstatus *cs)
     return 0;
 }
 
-int parse_tologin (int fd)
+void parse_tologin (int fd)
 {
     int  i;
     struct char_session_data *sd;
@@ -1894,7 +1846,7 @@ int parse_tologin (int fd)
         }
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     sd = session[fd]->session_data;
@@ -1907,7 +1859,7 @@ int parse_tologin (int fd)
         {
             case 0x2711:
                 if (RFIFOREST (fd) < 3)
-                    return 0;
+                    return;
                 if (RFIFOB (fd, 2))
                 {
 //              printf("connect login server error : %d\n", RFIFOB(fd,2));
@@ -1936,7 +1888,7 @@ int parse_tologin (int fd)
 
             case 0x2713:
                 if (RFIFOREST (fd) < 51)
-                    return 0;
+                    return;
 //          printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6));
                 for (i = 0; i < fd_max; i++)
                 {
@@ -1980,7 +1932,7 @@ int parse_tologin (int fd)
                 // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor]
             case 0x2717:
                 if (RFIFOREST (fd) < 50)
-                    return 0;
+                    return;
                 for (i = 0; i < fd_max; i++)
                 {
                     if (session[i] && (sd = session[i]->session_data))
@@ -2000,7 +1952,7 @@ int parse_tologin (int fd)
 
             case 0x2721:       // gm reply
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 {
                     unsigned char buf[10];
                     WBUFW (buf, 0) = 0x2b0b;
@@ -2014,7 +1966,7 @@ int parse_tologin (int fd)
 
             case 0x2723:       // changesex reply (modified by [Yor])
                 if (RFIFOREST (fd) < 7)
-                    return 0;
+                    return;
                 {
                     int  acc, sex, i, j;
                     unsigned char buf[7];
@@ -2079,7 +2031,7 @@ int parse_tologin (int fd)
             case 0x2726:       // Request to send a broadcast message (no answer)
                 if (RFIFOREST (fd) < 8
                     || RFIFOREST (fd) < (8 + RFIFOL (fd, 4)))
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 4) < 1)
                     char_log
                         ("Receiving a message for broadcast, but message is void."
@@ -2166,7 +2118,7 @@ int parse_tologin (int fd)
                 // account_reg2変更通知
             case 0x2729:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     struct global_reg reg[ACCOUNT_REG2_NUM];
                     unsigned char buf[4096];
@@ -2192,7 +2144,7 @@ int parse_tologin (int fd)
             case 0x7924:
             {                   // [Fate] Itemfrob package: forwarded from login-server
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 int  source_id = RFIFOL (fd, 2);
                 int  dest_id = RFIFOL (fd, 6);
                 unsigned char buf[10];
@@ -2240,7 +2192,7 @@ int parse_tologin (int fd)
                 // Account deletion notification (from login-server)
             case 0x2730:
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 // Deletion of all characters of the account
                 for (i = 0; i < char_num; i++)
                 {
@@ -2302,7 +2254,7 @@ int parse_tologin (int fd)
                 // State change of account/ban notification (from login-server) by [Yor]
             case 0x2731:
                 if (RFIFOREST (fd) < 11)
-                    return 0;
+                    return;
                 // send to all map-servers to disconnect the player
                 {
                     unsigned char buf[11];
@@ -2320,14 +2272,12 @@ int parse_tologin (int fd)
                 // Receiving GM acounts info from login-server (by [Yor])
             case 0x2732:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     char buf[32000];
                     if (gm_account != NULL)
                         free (gm_account);
-                    gm_account =
-                        calloc (sizeof (struct gm_account) *
-                                ((RFIFOW (fd, 2) - 4) / 5), 1);
+                    CREATE (gm_account, struct gm_account, (RFIFOW (fd, 2) - 4) / 5);
                     GM_num = 0;
                     for (i = 4; i < RFIFOW (fd, 2); i = i + 5)
                     {
@@ -2353,7 +2303,7 @@ int parse_tologin (int fd)
 
             case 0x2741:       // change password reply
                 if (RFIFOREST (fd) < 7)
-                    return 0;
+                    return;
                 {
                     int  acc, status, i;
                     acc = RFIFOL (fd, 2);
@@ -2378,18 +2328,17 @@ int parse_tologin (int fd)
 
             default:
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
     }
     RFIFOFLUSH (fd);
-
-    return 0;
 }
 
 //--------------------------------
 // Map-server anti-freeze system
 //--------------------------------
-int map_anti_freeze_system (int tid, unsigned int tick, int id, int data)
+typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t);
+void map_anti_freeze_system (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  i;
 
@@ -2411,11 +2360,9 @@ int map_anti_freeze_system (int tid, unsigned int tick, int id, int data)
             }
         }
     }
-
-    return 0;
 }
 
-int parse_frommap (int fd)
+void parse_frommap (int fd)
 {
     int  i, j;
     int  id;
@@ -2438,7 +2385,7 @@ int parse_frommap (int fd)
         }
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     while (RFIFOREST (fd) >= 2)
@@ -2461,7 +2408,7 @@ int parse_frommap (int fd)
                 // Receiving map names list from the map-server
             case 0x2afa:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 memset (server[id].map, 0, sizeof (server[id].map));
                 j = 0;
                 for (i = 4; i < RFIFOW (fd, 2); i += 16)
@@ -2531,7 +2478,7 @@ int parse_frommap (int fd)
                 // 認証要求
             case 0x2afc:
                 if (RFIFOREST (fd) < 22)
-                    return 0;
+                    return;
                 //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
                 for (i = 0; i < AUTH_FIFO_SIZE; i++)
                 {
@@ -2581,7 +2528,7 @@ int parse_frommap (int fd)
                 // MAPサーバー上のユーザー数受信
             case 0x2aff:
                 if (RFIFOREST (fd) < 6 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 server[id].users = RFIFOW (fd, 4);
                 if (anti_freeze_enable)
                     server_freezeflag[id] = 5;  // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
@@ -2613,7 +2560,7 @@ int parse_frommap (int fd)
                 // キャラデータ保存
             case 0x2b01:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 for (i = 0; i < char_num; i++)
                 {
                     if (char_dat[i].account_id == RFIFOL (fd, 4) &&
@@ -2629,7 +2576,7 @@ int parse_frommap (int fd)
                 // キャラセレ要求
             case 0x2b02:
                 if (RFIFOREST (fd) < 18)
-                    return 0;
+                    return;
                 if (auth_fifo_pos >= AUTH_FIFO_SIZE)
                     auth_fifo_pos = 0;
                 //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
@@ -2652,7 +2599,7 @@ int parse_frommap (int fd)
                 // マップサーバー間移動要求
             case 0x2b05:
                 if (RFIFOREST (fd) < 49)
-                    return 0;
+                    return;
                 if (auth_fifo_pos >= AUTH_FIFO_SIZE)
                     auth_fifo_pos = 0;
                 WFIFOW (fd, 0) = 0x2b06;
@@ -2684,7 +2631,7 @@ int parse_frommap (int fd)
                 // キャラ名検索
             case 0x2b08:
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 for (i = 0; i < char_num; i++)
                 {
                     if (char_dat[i].char_id == RFIFOL (fd, 2))
@@ -2703,7 +2650,7 @@ int parse_frommap (int fd)
                 // it is a request to become GM
             case 0x2b0a:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
 //          printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8));
                 if (login_fd > 0)
                 {               // don't send request if no login-server
@@ -2725,7 +2672,7 @@ int parse_frommap (int fd)
                 // Map server send information to change an email of an account -> login-server
             case 0x2b0c:
                 if (RFIFOREST (fd) < 86)
-                    return 0;
+                    return;
                 if (login_fd > 0)
                 {               // don't send request if no login-server
                     memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), 86);  // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
@@ -2738,7 +2685,7 @@ int parse_frommap (int fd)
                 // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server)
             case 0x2b0e:
                 if (RFIFOREST (fd) < 44)
-                    return 0;
+                    return;
                 {
                     char character_name[24];
                     int  acc = RFIFOL (fd, 2);  // account_id of who ask (-1 if nobody)
@@ -2877,7 +2824,7 @@ int parse_frommap (int fd)
                 // account_reg保存要求
             case 0x2b10:
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     struct global_reg reg[ACCOUNT_REG2_NUM];
                     int  p, acc;
@@ -2910,7 +2857,7 @@ int parse_frommap (int fd)
                 // Map server is requesting a divorce
             case 0x2b16:
                 if (RFIFOREST (fd) < 4)
-                    return 0;
+                    return;
                 {
                     for (i = 0; i < char_num; i++)
                         if (char_dat[i].char_id == RFIFOL (fd, 2))
@@ -2931,17 +2878,16 @@ int parse_frommap (int fd)
                 if (r == 1)     // 処理できた
                     break;
                 if (r == 2)     // パケット長が足りない
-                    return 0;
+                    return;
             }
                 // inter server処理でもない場合は切断
                 printf
                     ("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n",
                      RFIFOW (fd, 0), RFIFOREST (fd));
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
     }
-    return 0;
 }
 
 int search_mapserver (char *map)
@@ -3002,7 +2948,7 @@ int lan_ip_check (unsigned char *p)
     return lancheck;
 }
 
-int parse_char (int fd)
+void parse_char (int fd)
 {
     int  i, ch;
     char email[40];
@@ -3015,7 +2961,7 @@ int parse_char (int fd)
             login_fd = -1;
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     sd = session[fd]->session_data;
@@ -3029,13 +2975,13 @@ int parse_char (int fd)
         {
             case 0x20b:        //20040622暗号化ragexe対応
                 if (RFIFOREST (fd) < 19)
-                    return 0;
+                    return;
                 RFIFOSKIP (fd, 19);
                 break;
 
             case 0x61:         // change password request
                 if (RFIFOREST (fd) < 50)
-                    return 0;
+                    return;
                 {
                     WFIFOW (login_fd, 0) = 0x2740;
                     WFIFOL (login_fd, 2) = sd->account_id;
@@ -3048,7 +2994,7 @@ int parse_char (int fd)
 
             case 0x65:         // 接続要求
                 if (RFIFOREST (fd) < 17)
-                    return 0;
+                    return;
                 {
                     int  GM_value;
                     if ((GM_value = isGM (RFIFOL (fd, 2))))
@@ -3060,9 +3006,8 @@ int parse_char (int fd)
                                 RFIFOL (fd, 2));
                     if (sd == NULL)
                     {
-                        sd = session[fd]->session_data =
-                            calloc (sizeof (struct char_session_data), 1);
-                        memset (sd, 0, sizeof (struct char_session_data));
+                        CREATE (sd, struct char_session_data, 1);
+                        session[fd]->session_data = sd;
                         memcpy (sd->email, "no mail", 40);  // put here a mail without '@' to refuse deletion if we don't receive the e-mail
                         sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
                     }
@@ -3141,7 +3086,7 @@ int parse_char (int fd)
 
             case 0x66:         // キャラ選択
                 if (!sd || RFIFOREST (fd) < 3)
-                    return 0;
+                    return;
 
                 char ip[16];
                 unsigned char *sin_addr =
@@ -3311,7 +3256,7 @@ int parse_char (int fd)
 
             case 0x67:         // 作成
                 if (!sd || RFIFOREST (fd) < 37)
-                    return 0;
+                    return;
                 i = make_new_char (fd, RFIFOP (fd, 2));
                 if (i < 0)
                 {
@@ -3386,7 +3331,7 @@ int parse_char (int fd)
 
             case 0x68:         // delete char //Yor's Fix
                 if (!sd || RFIFOREST (fd) < 46)
-                    return 0;
+                    return;
                 memcpy (email, RFIFOP (fd, 6), 40);
                 if (e_mail_check (email) == 0)
                     strncpy (email, "a@a.com", 40); // default e-mail
@@ -3440,7 +3385,7 @@ int parse_char (int fd)
                 }
                 else
                 {
-                    /*if (strcmpi(email, sd->email) != 0) { // if it's an invalid email
+                    /*if (strcasecmp(email, sd->email) != 0) { // if it's an invalid email
                      * WFIFOW(fd, 0) = 0x70;
                      * WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
                      * WFIFOSET(fd, 3);
@@ -3512,7 +3457,7 @@ int parse_char (int fd)
 
             case 0x2af8:       // マップサーバーログイン
                 if (RFIFOREST (fd) < 60)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x2af9;
                 for (i = 0; i < MAX_MAP_SERVERS; i++)
                 {
@@ -3555,13 +3500,13 @@ int parse_char (int fd)
                     }
                     WFIFOW (fd, 2) = len;
                     WFIFOSET (fd, len);
-                    return 0;
+                    return;
                 }
                 break;
 
             case 0x187:        // Alive信号?
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 RFIFOSKIP (fd, 6);
                 break;
 
@@ -3576,19 +3521,17 @@ int parse_char (int fd)
                 WFIFOW (fd, 8) = ATHENA_MOD_VERSION;
                 WFIFOSET (fd, 10);
                 RFIFOSKIP (fd, 2);
-                return 0;
+                return;
 
             case 0x7532:       // 接続の切断(defaultと処理は一緒だが明示的にするため)
                 session[fd]->eof = 1;
-                return 0;
+                return;
 
             default:
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
     }
-    RFIFOFLUSH (fd);
-    return 0;
 }
 
 // 全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す)
@@ -3649,7 +3592,7 @@ int mapif_send (int fd, unsigned char *buf, unsigned int len)
     return 0;
 }
 
-int send_users_tologin (int tid, unsigned int tick, int id, int data)
+void send_users_tologin (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  users = count_users ();
     char buf[16];
@@ -3665,17 +3608,15 @@ int send_users_tologin (int tid, unsigned int tick, int id, int data)
     WBUFW (buf, 0) = 0x2b00;
     WBUFL (buf, 2) = users;
     mapif_sendall (buf, 6);
-
-    return 0;
 }
 
-int check_connect_login_server (int tid, unsigned int tick, int id, int data)
+void check_connect_login_server (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     if (login_fd <= 0 || session[login_fd] == NULL)
     {
         printf ("Attempt to connect to login-server...\n");
         if ((login_fd = make_connection (login_ip, login_port)) < 0)
-            return 0;
+            return;
         session[login_fd]->func_parse = parse_tologin;
         realloc_fifo (login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
         WFIFOW (login_fd, 0) = 0x2710;
@@ -3696,7 +3637,6 @@ int check_connect_login_server (int tid, unsigned int tick, int id, int data)
         WFIFOW (login_fd, 84) = char_new;
         WFIFOSET (login_fd, 86);
     }
-    return 0;
 }
 
 //----------------------------------------------------------
@@ -3705,12 +3645,12 @@ int check_connect_login_server (int tid, unsigned int tick, int id, int data)
 //----------------------------------------------------------
 int config_switch (const char *str)
 {
-    if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
-        || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
-        || strcmpi (str, "si") == 0)
+    if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+        || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+        || strcasecmp (str, "si") == 0)
         return 1;
-    if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
-        || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+    if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+        || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
         return 0;
 
     return atoi (str);
@@ -3756,7 +3696,7 @@ int lan_config_read (const char *lancfgName)
 
         remove_control_chars (w1);
         remove_control_chars (w2);
-        if (strcmpi (w1, "lan_map_ip") == 0)
+        if (strcasecmp (w1, "lan_map_ip") == 0)
         {                       // Read map-server Lan IP Address
             h = gethostbyname (w2);
             if (h != NULL)
@@ -3774,7 +3714,7 @@ int lan_config_read (const char *lancfgName)
             }
             printf ("LAN IP of map-server: %s.\n", lan_map_ip);
         }
-        else if (strcmpi (w1, "subnet") == 0)
+        else if (strcasecmp (w1, "subnet") == 0)
         {                       // Read Subnetwork
             for (j = 0; j < 4; j++)
                 subneti[j] = 0;
@@ -3792,7 +3732,7 @@ int lan_config_read (const char *lancfgName)
             printf ("Sub-network of the map-server: %d.%d.%d.%d.\n",
                     subneti[0], subneti[1], subneti[2], subneti[3]);
         }
-        else if (strcmpi (w1, "subnetmask") == 0)
+        else if (strcasecmp (w1, "subnetmask") == 0)
         {                       // Read Subnetwork Mask
             for (j = 0; j < 4; j++)
                 subnetmaski[j] = 255;
@@ -3859,21 +3799,21 @@ int char_config_read (const char *cfgName)
 
         remove_control_chars (w1);
         remove_control_chars (w2);
-        if (strcmpi (w1, "userid") == 0)
+        if (strcasecmp (w1, "userid") == 0)
         {
             memcpy (userid, w2, 24);
         }
-        else if (strcmpi (w1, "passwd") == 0)
+        else if (strcasecmp (w1, "passwd") == 0)
         {
             memcpy (passwd, w2, 24);
         }
-        else if (strcmpi (w1, "server_name") == 0)
+        else if (strcasecmp (w1, "server_name") == 0)
         {
             memcpy (server_name, w2, sizeof (server_name));
             server_name[sizeof (server_name) - 1] = '\0';
             printf ("%s server has been intialized\n", w2);
         }
-        else if (strcmpi (w1, "wisp_server_name") == 0)
+        else if (strcasecmp (w1, "wisp_server_name") == 0)
         {
             if (strlen (w2) >= 4)
             {
@@ -3881,7 +3821,7 @@ int char_config_read (const char *cfgName)
                 wisp_server_name[sizeof (wisp_server_name) - 1] = '\0';
             }
         }
-        else if (strcmpi (w1, "login_ip") == 0)
+        else if (strcasecmp (w1, "login_ip") == 0)
         {
             h = gethostbyname (w2);
             if (h != NULL)
@@ -3900,11 +3840,11 @@ int char_config_read (const char *cfgName)
             else
                 memcpy (login_ip_str, w2, 16);
         }
-        else if (strcmpi (w1, "login_port") == 0)
+        else if (strcasecmp (w1, "login_port") == 0)
         {
             login_port = atoi (w2);
         }
-        else if (strcmpi (w1, "char_ip") == 0)
+        else if (strcasecmp (w1, "char_ip") == 0)
         {
             h = gethostbyname (w2);
             if (h != NULL)
@@ -3923,51 +3863,51 @@ int char_config_read (const char *cfgName)
             else
                 memcpy (char_ip_str, w2, 16);
         }
-        else if (strcmpi (w1, "char_port") == 0)
+        else if (strcasecmp (w1, "char_port") == 0)
         {
             char_port = atoi (w2);
         }
-        else if (strcmpi (w1, "char_maintenance") == 0)
+        else if (strcasecmp (w1, "char_maintenance") == 0)
         {
             char_maintenance = atoi (w2);
         }
-        else if (strcmpi (w1, "char_new") == 0)
+        else if (strcasecmp (w1, "char_new") == 0)
         {
             char_new = atoi (w2);
         }
-        else if (strcmpi (w1, "email_creation") == 0)
+        else if (strcasecmp (w1, "email_creation") == 0)
         {
             email_creation = config_switch (w2);
         }
-        else if (strcmpi (w1, "char_txt") == 0)
+        else if (strcasecmp (w1, "char_txt") == 0)
         {
             strcpy (char_txt, w2);
         }
-        else if (strcmpi (w1, "backup_txt") == 0)
+        else if (strcasecmp (w1, "backup_txt") == 0)
         {                       //By zanetheinsane
             strcpy (backup_txt, w2);
         }
-        else if (strcmpi (w1, "backup_txt_flag") == 0)
+        else if (strcasecmp (w1, "backup_txt_flag") == 0)
         {                       // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor]
             backup_txt_flag = config_switch (w2);
         }
-        else if (strcmpi (w1, "max_connect_user") == 0)
+        else if (strcasecmp (w1, "max_connect_user") == 0)
         {
             max_connect_user = atoi (w2);
             if (max_connect_user < 0)
                 max_connect_user = 0;   // unlimited online players
         }
-        else if (strcmpi (w1, "check_ip_flag") == 0)
+        else if (strcasecmp (w1, "check_ip_flag") == 0)
         {
             check_ip_flag = config_switch (w2);
         }
-        else if (strcmpi (w1, "autosave_time") == 0)
+        else if (strcasecmp (w1, "autosave_time") == 0)
         {
             autosave_interval = atoi (w2) * 1000;
             if (autosave_interval <= 0)
                 autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
         }
-        else if (strcmpi (w1, "start_point") == 0)
+        else if (strcasecmp (w1, "start_point") == 0)
         {
             char map[32];
             int  x, y;
@@ -3980,85 +3920,85 @@ int char_config_read (const char *cfgName)
                 start_point.y = y;
             }
         }
-        else if (strcmpi (w1, "start_zeny") == 0)
+        else if (strcasecmp (w1, "start_zeny") == 0)
         {
             start_zeny = atoi (w2);
             if (start_zeny < 0)
                 start_zeny = 0;
         }
-        else if (strcmpi (w1, "start_weapon") == 0)
+        else if (strcasecmp (w1, "start_weapon") == 0)
         {
             start_weapon = atoi (w2);
             if (start_weapon < 0)
                 start_weapon = 0;
         }
-        else if (strcmpi (w1, "start_armor") == 0)
+        else if (strcasecmp (w1, "start_armor") == 0)
         {
             start_armor = atoi (w2);
             if (start_armor < 0)
                 start_armor = 0;
         }
-        else if (strcmpi (w1, "unknown_char_name") == 0)
+        else if (strcasecmp (w1, "unknown_char_name") == 0)
         {
             strcpy (unknown_char_name, w2);
             unknown_char_name[24] = 0;
         }
-        else if (strcmpi (w1, "char_log_filename") == 0)
+        else if (strcasecmp (w1, "char_log_filename") == 0)
         {
             strcpy (char_log_filename, w2);
         }
-        else if (strcmpi (w1, "name_ignoring_case") == 0)
+        else if (strcasecmp (w1, "name_ignoring_case") == 0)
         {
             name_ignoring_case = config_switch (w2);
         }
-        else if (strcmpi (w1, "char_name_option") == 0)
+        else if (strcasecmp (w1, "char_name_option") == 0)
         {
             char_name_option = atoi (w2);
         }
-        else if (strcmpi (w1, "char_name_letters") == 0)
+        else if (strcasecmp (w1, "char_name_letters") == 0)
         {
             strcpy (char_name_letters, w2);
 // online files options
         }
-        else if (strcmpi (w1, "online_txt_filename") == 0)
+        else if (strcasecmp (w1, "online_txt_filename") == 0)
         {
             strcpy (online_txt_filename, w2);
         }
-        else if (strcmpi (w1, "online_html_filename") == 0)
+        else if (strcasecmp (w1, "online_html_filename") == 0)
         {
             strcpy (online_html_filename, w2);
         }
-        else if (strcmpi (w1, "online_sorting_option") == 0)
+        else if (strcasecmp (w1, "online_sorting_option") == 0)
         {
             online_sorting_option = atoi (w2);
         }
-        else if (strcmpi (w1, "online_display_option") == 0)
+        else if (strcasecmp (w1, "online_display_option") == 0)
         {
             online_display_option = atoi (w2);
         }
-        else if (strcmpi (w1, "online_gm_display_min_level") == 0)
+        else if (strcasecmp (w1, "online_gm_display_min_level") == 0)
         {                       // minimum GM level to display 'GM' when we want to display it
             online_gm_display_min_level = atoi (w2);
             if (online_gm_display_min_level < 5)    // send online file every 5 seconds to player is enough
                 online_gm_display_min_level = 5;
         }
-        else if (strcmpi (w1, "online_refresh_html") == 0)
+        else if (strcasecmp (w1, "online_refresh_html") == 0)
         {
             online_refresh_html = atoi (w2);
             if (online_refresh_html < 1)
                 online_refresh_html = 1;
         }
-        else if (strcmpi (w1, "anti_freeze_enable") == 0)
+        else if (strcasecmp (w1, "anti_freeze_enable") == 0)
         {
             anti_freeze_enable = config_switch (w2);
         }
-        else if (strcmpi (w1, "anti_freeze_interval") == 0)
+        else if (strcasecmp (w1, "anti_freeze_interval") == 0)
         {
             ANTI_FREEZE_INTERVAL = atoi (w2);
             if (ANTI_FREEZE_INTERVAL < 5)
                 ANTI_FREEZE_INTERVAL = 5;   // minimum 5 seconds
         }
-        else if (strcmpi (w1, "import") == 0)
+        else if (strcasecmp (w1, "import") == 0)
         {
             char_config_read (w2);
         }
@@ -4068,7 +4008,7 @@ int char_config_read (const char *cfgName)
     return 0;
 }
 
-void do_final (void)
+void term_func (void)
 {
     int  i;
 
@@ -4119,15 +4059,14 @@ int do_init (int argc, char **argv)
 
     inter_init ((argc > 2) ? argv[2] : inter_cfgName);  // inter server 初期化
 
-    set_termfunc (do_final);
+//    set_termfunc (do_final);
     set_defaultparse (parse_char);
 
     char_fd = make_listen_port (char_port);
 
-    add_timer_func_list (check_connect_login_server,
-                         "check_connect_login_server");
-    add_timer_func_list (send_users_tologin, "send_users_tologin");
-    add_timer_func_list (mmo_char_sync_timer, "mmo_char_sync_timer");
+//    add_timer_func_list (check_connect_login_server, "check_connect_login_server");
+//    add_timer_func_list (send_users_tologin, "send_users_tologin");
+//    add_timer_func_list (mmo_char_sync_timer, "mmo_char_sync_timer");
 
     i = add_timer_interval (gettick () + 1000, check_connect_login_server, 0,
                             0, 10 * 1000);
@@ -4138,8 +4077,7 @@ int do_init (int argc, char **argv)
 
     if (anti_freeze_enable > 0)
     {
-        add_timer_func_list (map_anti_freeze_system,
-                             "map_anti_freeze_system");
+//        add_timer_func_list (map_anti_freeze_system, "map_anti_freeze_system");
         i = add_timer_interval (gettick () + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000);  // checks every X seconds user specifies
     }
 
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index e145b66..9715700 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -30,7 +30,7 @@ int  guild_calcinfo (struct guild *g);
 int  mapif_guild_basicinfochanged (int guild_id, int type, const void *data,
                                    int len);
 int  mapif_guild_info (int fd, struct guild *g);
-int  guild_break_sub (void *key, void *data, va_list ap);
+void guild_break_sub (db_key_t key, db_val_t data, va_list ap);
 
 // ギルドデータの文字列への変換
 int inter_guild_tostr (char *str, struct guild *g)
@@ -448,14 +448,7 @@ int inter_guild_init ()
             guild_newid = i;
             continue;
         }
-
-        g = calloc (sizeof (struct guild), 1);
-        if (g == NULL)
-        {
-            printf ("int_guild: out of memory!\n");
-            exit (0);
-        }
-        memset (g, 0, sizeof (struct guild));
+        CREATE (g, struct guild, 1);
         if (inter_guild_fromstr (line, g) == 0 && g->guild_id > 0)
         {
             if (g->guild_id >= guild_newid)
@@ -483,13 +476,7 @@ int inter_guild_init ()
 
     while (fgets (line, sizeof (line) - 1, fp))
     {
-        gc = calloc (sizeof (struct guild_castle), 1);
-        if (gc == NULL)
-        {
-            printf ("int_guild: out of memory!\n");
-            exit (0);
-        }
-        memset (gc, 0, sizeof (struct guild_castle));
+        CREATE (gc, struct guild_castle, 1);
         if (inter_guildcastle_fromstr (line, gc) == 0)
         {
             numdb_insert (castle_db, gc->castle_id, gc);
@@ -508,13 +495,7 @@ int inter_guild_init ()
         //デフォルトデータを作成
         for (i = 0; i < MAX_GUILDCASTLE; i++)
         {
-            gc = calloc (sizeof (struct guild_castle), 1);
-            if (gc == NULL)
-            {
-                printf ("int_guild: out of memory!\n");
-                exit (0);
-            }
-            memset (gc, 0, sizeof (struct guild_castle));
+            CREATE (gc, struct guild_castle, 1);
             gc->castle_id = i;
             gc->guild_id = 0;
             gc->economy = 0;
@@ -562,7 +543,7 @@ struct guild *inter_guild_search (int guild_id)
 }
 
 // ギルドデータのセーブ用
-int inter_guild_save_sub (void *key, void *data, va_list ap)
+void inter_guild_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[16384];
     FILE *fp;
@@ -570,12 +551,10 @@ int inter_guild_save_sub (void *key, void *data, va_list ap)
     inter_guild_tostr (line, (struct guild *) data);
     fp = va_arg (ap, FILE *);
     fprintf (fp, "%s" RETCODE, line);
-
-    return 0;
 }
 
 // ギルド城データのセーブ用
-int inter_castle_save_sub (void *key, void *data, va_list ap)
+void inter_castle_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[16384];
     FILE *fp;
@@ -583,8 +562,6 @@ int inter_castle_save_sub (void *key, void *data, va_list ap)
     inter_guildcastle_tostr (line, (struct guild_castle *) data);
     fp = va_arg (ap, FILE *);
     fprintf (fp, "%s" RETCODE, line);
-
-    return 0;
 }
 
 // ギルドデータのセーブ
@@ -617,16 +594,15 @@ int inter_guild_save ()
 }
 
 // ギルド名検索用
-int search_guildname_sub (void *key, void *data, va_list ap)
+void search_guildname_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = (struct guild *) data, **dst;
     char *str;
 
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct guild **);
-    if (strcmpi (g->name, str) == 0)
+    if (strcasecmp (g->name, str) == 0)
         *dst = g;
-    return 0;
 }
 
 // ギルド名検索
@@ -660,7 +636,7 @@ int guild_check_empty (struct guild *g)
 }
 
 // キャラの競合がないかチェック用
-int guild_check_conflict_sub (void *key, void *data, va_list ap)
+void guild_check_conflict_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = (struct guild *) data;
     int  guild_id, account_id, char_id, i;
@@ -670,7 +646,7 @@ int guild_check_conflict_sub (void *key, void *data, va_list ap)
     char_id = va_arg (ap, int);
 
     if (g->guild_id == guild_id)    // 本来の所属なので問題なし
-        return 0;
+        return;
 
     for (i = 0; i < MAX_GUILD; i++)
     {
@@ -683,8 +659,6 @@ int guild_check_conflict_sub (void *key, void *data, va_list ap)
                                     "**データ競合**");
         }
     }
-
-    return 0;
 }
 
 // キャラの競合がないかチェック
@@ -1037,7 +1011,7 @@ int mapif_guild_castle_datasave (int castle_id, int index, int value)
     return 0;
 }
 
-int mapif_guild_castle_alldataload_sub (void *key, void *data, va_list ap)
+void mapif_guild_castle_alldataload_sub (db_key_t key, db_val_t data, va_list ap)
 {
     int  fd = va_arg (ap, int);
     int *p = va_arg (ap, int *);
@@ -1045,8 +1019,6 @@ int mapif_guild_castle_alldataload_sub (void *key, void *data, va_list ap)
     memcpy (WFIFOP (fd, *p), (struct guild_castle *) data,
             sizeof (struct guild_castle));
     (*p) += sizeof (struct guild_castle);
-
-    return 0;
 }
 
 int mapif_guild_castle_alldataload (int fd)
@@ -1087,14 +1059,7 @@ int mapif_parse_CreateGuild (int fd, int account_id, char *name,
         mapif_guild_created (fd, account_id, NULL);
         return 0;
     }
-    g = calloc (sizeof (struct guild), 1);
-    if (g == NULL)
-    {
-        printf ("int_guild: CreateGuild: out of memory !\n");
-        mapif_guild_created (fd, account_id, NULL);
-        exit (0);
-    }
-    memset (g, 0, sizeof (struct guild));
+    CREATE (g, struct guild, 1);
     g->guild_id = guild_newid++;
     memcpy (g->name, name, 24);
     memcpy (g->master, master->name, 24);
@@ -1263,7 +1228,7 @@ int mapif_parse_GuildChangeMemberInfoShort (int fd, int guild_id,
 }
 
 // ギルド解散処理用(同盟/敵対を解除)
-int guild_break_sub (void *key, void *data, va_list ap)
+void guild_break_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = (struct guild *) data;
     int  guild_id = va_arg (ap, int);
@@ -1274,7 +1239,6 @@ int guild_break_sub (void *key, void *data, va_list ap)
         if (g->alliance[i].guild_id == guild_id)
             g->alliance[i].guild_id = 0;
     }
-    return 0;
 }
 
 // ギルド解散要求
diff --git a/src/char/int_party.c b/src/char/int_party.c
index c5ed033..b728b1e 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -110,13 +110,7 @@ int inter_party_init ()
             continue;
         }
 
-        p = calloc (sizeof (struct party), 1);
-        if (p == NULL)
-        {
-            printf ("int_party: out of memory!\n");
-            exit (0);
-        }
-        memset (p, 0, sizeof (struct party));
+        CREATE (p, struct party, 1);
         if (inter_party_fromstr (line, p) == 0 && p->party_id > 0)
         {
             if (p->party_id >= party_newid)
@@ -139,7 +133,7 @@ int inter_party_init ()
 }
 
 // パーティーデータのセーブ用
-int inter_party_save_sub (void *key, void *data, va_list ap)
+void inter_party_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[8192];
     FILE *fp;
@@ -147,8 +141,6 @@ int inter_party_save_sub (void *key, void *data, va_list ap)
     inter_party_tostr (line, (struct party *) data);
     fp = va_arg (ap, FILE *);
     fprintf (fp, "%s" RETCODE, line);
-
-    return 0;
 }
 
 // パーティーデータのセーブ
@@ -172,17 +164,15 @@ int inter_party_save ()
 }
 
 // パーティ名検索用
-int search_partyname_sub (void *key, void *data, va_list ap)
+void search_partyname_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct party *p = (struct party *) data, **dst;
     char *str;
 
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct party **);
-    if (strcmpi (p->name, str) == 0)
+    if (strcasecmp (p->name, str) == 0)
         *dst = p;
-
-    return 0;
 }
 
 // パーティ名検索
@@ -238,7 +228,7 @@ int party_check_empty (struct party *p)
 }
 
 // キャラの競合がないかチェック用
-int party_check_conflict_sub (void *key, void *data, va_list ap)
+void party_check_conflict_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct party *p = (struct party *) data;
     int  party_id, account_id, i;
@@ -249,7 +239,7 @@ int party_check_conflict_sub (void *key, void *data, va_list ap)
     nick = va_arg (ap, char *);
 
     if (p->party_id == party_id)    // 本来の所属なので問題なし
-        return 0;
+        return;
 
     for (i = 0; i < MAX_PARTY; i++)
     {
@@ -262,8 +252,6 @@ int party_check_conflict_sub (void *key, void *data, va_list ap)
             mapif_parse_PartyLeave (-1, p->party_id, account_id);
         }
     }
-
-    return 0;
 }
 
 // キャラの競合がないかチェック
@@ -449,14 +437,7 @@ int mapif_parse_CreateParty (int fd, int account_id, char *name, char *nick,
         mapif_party_created (fd, account_id, NULL);
         return 0;
     }
-    p = calloc (sizeof (struct party), 1);
-    if (p == NULL)
-    {
-        printf ("int_party: out of memory !\n");
-        mapif_party_created (fd, account_id, NULL);
-        return 0;
-    }
-    memset (p, 0, sizeof (struct party));
+    CREATE (p, struct party, 1);
     p->party_id = party_newid++;
     memcpy (p->name, name, 24);
     p->exp = 0;
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index 744a59f..99af725 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -7,7 +7,6 @@
 #include "../common/socket.h"
 #include "../common/db.h"
 #include "../common/lock.h"
-#include "../common/malloc.h"
 #include "char.h"
 #include "inter.h"
 #include "int_storage.h"
@@ -222,12 +221,7 @@ struct storage *account2storage (int account_id)
     s = (struct storage *) numdb_search (storage_db, account_id);
     if (s == NULL)
     {
-        s = (struct storage *) aCalloc (sizeof (struct storage), 1);
-        if (s == NULL)
-        {
-            printf ("int_storage: out of memory!\n");
-            exit (0);
-        }
+        CREATE (s, struct storage, 1);
         memset (s, 0, sizeof (struct storage));
         s->account_id = account_id;
         numdb_insert (storage_db, s->account_id, s);
@@ -244,14 +238,7 @@ struct guild_storage *guild2storage (int guild_id)
                                                     guild_id);
         if (gs == NULL)
         {
-            gs = (struct guild_storage *)
-                aCalloc (sizeof (struct guild_storage), 1);
-            if (gs == NULL)
-            {
-                printf ("int_storage: out of memory!\n");
-                exit (0);
-            }
-//          memset(gs,0,sizeof(struct guild_storage)); aCalloc does this! [Skotlex]
+            CREATE (gs, struct guild_storage, 1);
             gs->guild_id = guild_id;
             numdb_insert (guild_storage_db, gs->guild_id, gs);
         }
@@ -280,13 +267,7 @@ int inter_storage_init ()
     while (fgets (line, 65535, fp))
     {
         sscanf (line, "%d", &tmp_int);
-        s = (struct storage *) aCalloc (sizeof (struct storage), 1);
-        if (s == NULL)
-        {
-            printf ("int_storage: out of memory!\n");
-            exit (0);
-        }
-//      memset(s,0,sizeof(struct storage)); aCalloc does this...
+        CREATE (s, struct storage, 1);
         s->account_id = tmp_int;
         if (s->account_id > 0 && storage_fromstr (line, s) == 0)
         {
@@ -314,14 +295,7 @@ int inter_storage_init ()
     while (fgets (line, 65535, fp))
     {
         sscanf (line, "%d", &tmp_int);
-        gs = (struct guild_storage *) aCalloc (sizeof (struct guild_storage),
-                                               1);
-        if (gs == NULL)
-        {
-            printf ("int_storage: out of memory!\n");
-            exit (0);
-        }
-//      memset(gs,0,sizeof(struct guild_storage)); aCalloc...
+        CREATE (gs, struct guild_storage, 1);
         gs->guild_id = tmp_int;
         if (gs->guild_id > 0 && guild_storage_fromstr (line, gs) == 0)
         {
@@ -340,20 +314,18 @@ int inter_storage_init ()
     return 0;
 }
 
-int storage_db_final (void *k, void *data, va_list ap)
+void storage_db_final (db_key_t k, db_val_t data, va_list ap)
 {
     struct storage *p = (struct storage *) data;
     if (p)
         free (p);
-    return 0;
 }
 
-int guild_storage_db_final (void *k, void *data, va_list ap)
+void guild_storage_db_final (db_key_t k, db_val_t data, va_list ap)
 {
     struct guild_storage *p = (struct guild_storage *) data;
     if (p)
         free (p);
-    return 0;
 }
 
 void inter_storage_final ()
@@ -363,7 +335,7 @@ void inter_storage_final ()
     return;
 }
 
-int inter_storage_save_sub (void *key, void *data, va_list ap)
+void inter_storage_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[65536];
     FILE *fp;
@@ -371,7 +343,6 @@ int inter_storage_save_sub (void *key, void *data, va_list ap)
     fp = va_arg (ap, FILE *);
     if (*line)
         fprintf (fp, "%s" RETCODE, line);
-    return 0;
 }
 
 //---------------------------------------------------------
@@ -396,7 +367,7 @@ int inter_storage_save ()
     return 0;
 }
 
-int inter_guild_storage_save_sub (void *key, void *data, va_list ap)
+void inter_guild_storage_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[65536];
     FILE *fp;
@@ -409,7 +380,6 @@ int inter_guild_storage_save_sub (void *key, void *data, va_list ap)
         if (*line)
             fprintf (fp, "%s" RETCODE, line);
     }
-    return 0;
 }
 
 //---------------------------------------------------------
diff --git a/src/char/inter.c b/src/char/inter.c
index 5bee90f..f563931 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -120,13 +120,7 @@ int inter_accreg_init ()
     while (fgets (line, sizeof (line) - 1, fp))
     {
         line[sizeof (line) - 1] = '\0';
-
-        reg = calloc (sizeof (struct accreg), 1);
-        if (reg == NULL)
-        {
-            printf ("inter: accreg: out of memory!\n");
-            exit (0);
-        }
+        CREATE (reg, struct accreg, 1);
         if (inter_accreg_fromstr (line, reg) == 0 && reg->account_id > 0)
         {
             numdb_insert (accreg_db, reg->account_id, reg);
@@ -146,7 +140,7 @@ int inter_accreg_init ()
 }
 
 // アカウント変数のセーブ用
-int inter_accreg_save_sub (void *key, void *data, va_list ap)
+void inter_accreg_save_sub (db_key_t key, db_val_t data, va_list ap)
 {
     char line[8192];
     FILE *fp;
@@ -158,8 +152,6 @@ int inter_accreg_save_sub (void *key, void *data, va_list ap)
         fp = va_arg (ap, FILE *);
         fprintf (fp, "%s" RETCODE, line);
     }
-
-    return 0;
 }
 
 // アカウント変数のセーブ
@@ -207,41 +199,41 @@ int inter_config_read (const char *cfgName)
         if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2)
             continue;
 
-        if (strcmpi (w1, "storage_txt") == 0)
+        if (strcasecmp (w1, "storage_txt") == 0)
         {
             strncpy (storage_txt, w2, sizeof (storage_txt));
         }
-        else if (strcmpi (w1, "party_txt") == 0)
+        else if (strcasecmp (w1, "party_txt") == 0)
         {
             strncpy (party_txt, w2, sizeof (party_txt));
         }
-        else if (strcmpi (w1, "guild_txt") == 0)
+        else if (strcasecmp (w1, "guild_txt") == 0)
         {
             strncpy (guild_txt, w2, sizeof (guild_txt));
         }
-        else if (strcmpi (w1, "castle_txt") == 0)
+        else if (strcasecmp (w1, "castle_txt") == 0)
         {
             strncpy (castle_txt, w2, sizeof (castle_txt));
         }
-        else if (strcmpi (w1, "accreg_txt") == 0)
+        else if (strcasecmp (w1, "accreg_txt") == 0)
         {
             strncpy (accreg_txt, w2, sizeof (accreg_txt));
         }
-        else if (strcmpi (w1, "guild_storage_txt") == 0)
+        else if (strcasecmp (w1, "guild_storage_txt") == 0)
         {
             strncpy (guild_storage_txt, w2, sizeof (guild_storage_txt));
         }
-        else if (strcmpi (w1, "party_share_level") == 0)
+        else if (strcasecmp (w1, "party_share_level") == 0)
         {
             party_share_level = atoi (w2);
             if (party_share_level < 0)
                 party_share_level = 0;
         }
-        else if (strcmpi (w1, "inter_log_filename") == 0)
+        else if (strcasecmp (w1, "inter_log_filename") == 0)
         {
             strncpy (inter_log_filename, w2, sizeof (inter_log_filename));
         }
-        else if (strcmpi (w1, "import") == 0)
+        else if (strcasecmp (w1, "import") == 0)
         {
             inter_config_read (w2);
         }
@@ -392,7 +384,7 @@ int mapif_account_reg_reply (int fd, int account_id)
 //--------------------------------------------------------
 
 // Existence check of WISP data
-int check_ttl_wisdata_sub (void *key, void *data, va_list ap)
+void check_ttl_wisdata_sub (db_key_t key, db_val_t data, va_list ap)
 {
     unsigned long tick;
     struct WisData *wd = (struct WisData *) data;
@@ -401,8 +393,6 @@ int check_ttl_wisdata_sub (void *key, void *data, va_list ap)
     if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL
         && wis_delnum < WISDELLIST_MAX)
         wis_dellist[wis_delnum++] = wd->id;
-
-    return 0;
 }
 
 int check_ttl_wisdata ()
@@ -485,13 +475,7 @@ int mapif_parse_WisRequest (int fd)
         }
         else
         {
-
-            wd = (struct WisData *) calloc (sizeof (struct WisData), 1);
-            if (wd == NULL)
-            {
-                printf ("inter: WisRequest: out of memory !\n");
-                return 0;
-            }
+            CREATE (wd, struct WisData, 1);
 
             // Whether the failure of previous wisp/page transmission (timeout)
             check_ttl_wisdata ();
@@ -546,17 +530,13 @@ int mapif_parse_WisToGM (int fd)
 int mapif_parse_AccReg (int fd)
 {
     int  j, p;
-    struct accreg *reg = numdb_search (accreg_db, RFIFOL (fd, 4));
+    struct accreg *reg = numdb_search (accreg_db, (numdb_key_t)RFIFOL (fd, 4));
 
     if (reg == NULL)
     {
-        if ((reg = calloc (sizeof (struct accreg), 1)) == NULL)
-        {
-            printf ("inter: accreg: out of memory !\n");
-            exit (0);
-        }
+        CREATE (reg, struct accreg, 1);
         reg->account_id = RFIFOL (fd, 4);
-        numdb_insert (accreg_db, RFIFOL (fd, 4), reg);
+        numdb_insert (accreg_db, (numdb_key_t)RFIFOL (fd, 4), reg);
     }
 
     for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2);
diff --git a/src/common/Makefile b/src/common/Makefile
index 549268b..43552dc 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -1,5 +1,5 @@
 include ../../make.defs
-all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o malloc.o mt_rand.o md5calc.o
+all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o mt_rand.o md5calc.o
 
 core.o: core.c core.h
 socket.o: socket.c socket.h mmo.h
@@ -8,7 +8,6 @@ grfio.o: grfio.c grfio.h
 db.o: db.c db.h
 lock.o: lock.c lock.h
 nullpo.o: nullpo.c nullpo.h
-malloc.o: malloc.c malloc.h
 mt_rand.o: mt_rand.c mt_rand.h
 md5calc.o: md5calc.c md5calc.h
 
diff --git a/src/common/core.c b/src/common/core.c
index bf48dfc..2b1b67c 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -1,11 +1,6 @@
-// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
 #include <stdio.h>
 #include <stdlib.h>
-#ifndef LCCWIN32
 #include <unistd.h>
-#endif
 #include <signal.h>
 #include <sys/wait.h>
 
@@ -14,84 +9,23 @@
 #include "timer.h"
 #include "version.h"
 #include "mt_rand.h"
+#include "nullpo.h"
 
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static void (*term_func) (void) = NULL;
-
-/*======================================
- *	CORE : Set function
- *--------------------------------------
- */
-void set_termfunc (void (*termfunc) (void))
-{
-    term_func = termfunc;
-}
-
-/*======================================
- *	CORE : Signal Sub Function
- *--------------------------------------
- */
+/// Defined by each server
+extern int  do_init (int, char **);
+extern void term_func (void);
 
-static void sig_proc (int sn)
+static void chld_proc (int UNUSED)
 {
-    int  i;
-    switch (sn)
-    {
-        case SIGINT:
-        case SIGTERM:
-            if (term_func)
-                term_func ();
-            for (i = 0; i < fd_max; i++)
-            {
-                if (!session[i])
-                    continue;
-                close (i);
-            }
-            exit (0);
-            break;
-        case SIGCHLD:
-            wait (&i);
-            break;
-    }
+    wait(NULL);
 }
-
-int  eathena_interactive_session = 1;   // [fate] interactive session:  print pretty graphics
-
-/*======================================
- *	CORE : Display title
- *--------------------------------------
- */
-
-static void display_title (void)
+static void sig_proc (int UNUSED)
 {
-    // for help with the console colors look here:
-    // http://www.edoceo.com/liberum/?doc=printf-with-color
-    // some code explanation (used here):
-    // \033[2J : clear screen and go up/left (0, 0 position)
-    // \033[K  : clear line from actual position to end of the line
-    // \033[0m : reset color parameter
-    // \033[1m : use bold for font
-    if (eathena_interactive_session)
-    {
-        printf ("\033[2J");     // clear screen and go up/left (0, 0 position in text)
-        printf ("\033[37;44m          (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file
-        printf ("\033[0;44m          (\033[1;33m        (c)2004 eAthena Development Team presents        \033[0;44m)\033[K\033[0m\n");  // yellow writing (33)
-        printf ("\033[0;44m          (\033[1m       ______  __    __                                  \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m      /\\  _  \\/\\ \\__/\\ \\                     v%2d.%02d.%02d   \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m    __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___      __    ___      __      \033[0;44m)\033[K\033[0m\n");    // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m  /'__`\\ \\  __ \\ \\ \\/\\ \\  _ `\\  /'__`\\/' _ `\\  /'__`\\    \033[0;44m)\033[K\033[0m\n");  // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m /\\  __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\  __//\\ \\/\\ \\/\\ \\_\\.\\_  \033[0;44m)\033[K\033[0m\n");   // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m  \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n");  // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m   _   _   _   _   _   _   _     _   _   _   _   _   _   \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m  / \\ / \\ / \\ / \\ / \\ / \\ / \\   / \\ / \\ / \\ / \\ / \\ / \\  \033[0;44m)\033[K\033[0m\n");    // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
-        printf ("\033[0;44m          (\033[1m  \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/   \\_/ \\_/ \\_/ \\_/ \\_/ \\_/  \033[0;44m)\033[K\033[0m\n");    // 1: bold char, 0: normal char
-        printf ("\033[37;44m          (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n");   // reset color
-    }
+    term_func ();
+    for (int i = 0; i < fd_max; i++)
+        if (session[i])
+            close (i);
+    exit (0);
 }
 
 // Added by Gabuzomeu
@@ -100,69 +34,45 @@ static void display_title (void)
 // (sigaction() is POSIX; signal() is not.)  Taken from Stevens' _Advanced
 // Programming in the UNIX Environment_.
 //
-#ifndef SIGPIPE
-#define SIGPIPE SIGINT
-#endif
-
-#ifndef POSIX
-#define compat_signal(signo, func) signal(signo, func)
-#else
-sigfunc *compat_signal (int signo, sigfunc * func)
+typedef void (*sigfunc)(int);
+sigfunc compat_signal (int signo, sigfunc func)
 {
     struct sigaction sact, oact;
 
     sact.sa_handler = func;
     sigemptyset (&sact.sa_mask);
     sact.sa_flags = 0;
-#ifdef SA_INTERRUPT
-    sact.sa_flags |= SA_INTERRUPT;  /* SunOS */
-#endif
 
     if (sigaction (signo, &sact, &oact) < 0)
-        return (SIG_ERR);
+        return SIG_ERR;
 
-    return (oact.sa_handler);
+    return oact.sa_handler;
 }
-#endif
 
-/*======================================
- *	CORE : MAINROUTINE
- *--------------------------------------
- */
-
-int  runflag = 1;
+bool runflag = true;
 
 int main (int argc, char **argv)
 {
-    int  next;
-
-    mt_seed (time (NULL) ^ getpid () ^ getppid ());
+    /// Note that getpid() and getppid() may be very close
+    mt_seed (time (NULL) ^ (getpid () << 16) ^ (getppid () << 8));
 
-    Net_Init ();
     do_socket ();
 
     compat_signal (SIGPIPE, SIG_IGN);
     compat_signal (SIGTERM, sig_proc);
     compat_signal (SIGINT, sig_proc);
-    compat_signal (SIGCHLD, sig_proc);
+    compat_signal (SIGCHLD, chld_proc);
 
     // Signal to create coredumps by system when necessary (crash)
     compat_signal (SIGSEGV, SIG_DFL);
-#ifndef LCCWIN32
     compat_signal (SIGBUS, SIG_DFL);
     compat_signal (SIGTRAP, SIG_DFL);
-#endif
     compat_signal (SIGILL, SIG_DFL);
-    // [fate] detect interactive session
-    eathena_interactive_session = isatty (0);
-    display_title ();
 
     do_init (argc, argv);
     while (runflag)
     {
-        next = do_timer (gettick_nocache ());
-        do_sendrecv (next);
+        do_sendrecv (do_timer (gettick_nocache ()));
         do_parsepacket ();
     }
-    return 0;
 }
diff --git a/src/common/core.h b/src/common/core.h
index 90d8303..6722ca2 100644
--- a/src/common/core.h
+++ b/src/common/core.h
@@ -1,12 +1,19 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
+#ifndef CORE_H
+#define CORE_H
+#include <stdbool.h>
+/// core.c contains a server-independent main() function
+/// and then runs a do_sendrecv loop
 
-#ifndef	_CORE_H_
-#define	_CORE_H_
+/// When this is cleared, the server exits gracefully
+/// only used by map server's GM command: @mapexit
+extern bool runflag;
 
-extern int runflag;
+/// This is an external function defined by each server
+/// This function must register stuff for the parse loop
+extern int  do_init (int, char **);
 
-int  do_init (int, char **);
+/// Cleanup function called whenever a signal kills us
+/// NOT currently called when exit() is called
+extern void term_func (void);
 
-void set_termfunc (void (*termfunc) (void));
-
-#endif // _CORE_H_
+#endif // CORE_H
diff --git a/src/common/db.c b/src/common/db.c
index 07b08c8..cee17df 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -1,125 +1,93 @@
-// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $
-// #define MALLOC_DBN
+#include "db.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "db.h"
-#include "utils.h"
 
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
+#include "utils.h"
 
 #define ROOT_SIZE 4096
-#ifdef MALLOC_DBN
-static struct dbn *dbn_root[512], *dbn_free;
-static int dbn_root_rest = 0, dbn_root_num = 0;
-
-static void *malloc_dbn (void)
-{
-    struct dbn *ret;
-
-    if (dbn_free == NULL)
-    {
-        if (dbn_root_rest <= 0)
-        {
-            CREATE (dbn_root[dbn_root_num], struct dbn, ROOT_SIZE);
-
-            dbn_root_rest = ROOT_SIZE;
-            dbn_root_num++;
-        }
-        return &(dbn_root[dbn_root_num - 1][--dbn_root_rest]);
-    }
-    ret = dbn_free;
-    dbn_free = dbn_free->parent;
-    return ret;
-}
-
-static void free_dbn (struct dbn *add_dbn)
-{
-    add_dbn->parent = dbn_free;
-    dbn_free = add_dbn;
-}
-#endif
 
-static int strdb_cmp (struct dbt *table, void *a, void *b)
+static int strdb_cmp (struct dbt *table, const char *a, const char* b)
 {
     if (table->maxlen)
         return strncmp (a, b, table->maxlen);
     return strcmp (a, b);
 }
 
-static unsigned int strdb_hash (struct dbt *table, void *a)
+static hash_t strdb_hash (struct dbt *table, const char *a)
 {
-    int  i;
-    unsigned int h;
-    unsigned char *p = a;
-
-    i = table->maxlen;
+    size_t i = table->maxlen;
     if (i == 0)
-        i = 0x7fffffff;
-    for (h = 0; *p && --i >= 0;)
+        i = (size_t)-1;
+    hash_t h = 0;
+    const unsigned char *p = (const unsigned char*)a;
+    while (*p && i--)
     {
         h = (h * 33 + *p++) ^ (h >> 24);
     }
     return h;
 }
 
-struct dbt *strdb_init (int maxlen)
+struct dbt *strdb_init (size_t maxlen)
 {
-    int  i;
     struct dbt *table;
-
     CREATE (table, struct dbt, 1);
-
-    table->cmp = strdb_cmp;
-    table->hash = strdb_hash;
+    table->type = DB_STRING;
     table->maxlen = maxlen;
-    for (i = 0; i < HASH_SIZE; i++)
-        table->ht[i] = NULL;
     return table;
 }
 
-static int numdb_cmp (struct dbt *table, void *a, void *b)
+static int numdb_cmp (numdb_key_t a, numdb_key_t b)
 {
-    int  ia, ib;
-
-    ia = (int) a;
-    ib = (int) b;
-
-    if ((ia ^ ib) & 0x80000000)
-        return ia < 0 ? -1 : 1;
-
-    return ia - ib;
+    if (a == b)
+        return 0;
+    if (a < b)
+        return -1;
+    return 1;
 }
 
-static unsigned int numdb_hash (struct dbt *table, void *a)
+static hash_t numdb_hash (numdb_key_t a)
 {
-    return (unsigned int) a;
+    return (hash_t) a;
 }
 
 struct dbt *numdb_init (void)
 {
-    int  i;
     struct dbt *table;
-
     CREATE (table, struct dbt, 1);
-
-    table->cmp = numdb_cmp;
-    table->hash = numdb_hash;
-    table->maxlen = sizeof (int);
-    for (i = 0; i < HASH_SIZE; i++)
-        table->ht[i] = NULL;
+    table->type = DB_NUMBER;
     return table;
 }
 
-void *db_search (struct dbt *table, void *key)
+static int table_cmp (struct dbt *table, db_key_t a, db_key_t b)
+{
+    switch(table->type)
+    {
+    case DB_NUMBER: return numdb_cmp (a.i, b.i);
+    case DB_STRING: return strdb_cmp (table, a.s, b.s);
+    }
+    abort();
+}
+
+static hash_t table_hash (struct dbt *table, db_key_t key)
+{
+    switch(table->type)
+    {
+    case DB_NUMBER: return numdb_hash (key.i);
+    case DB_STRING: return strdb_hash (table, key.s);
+    }
+    abort();
+}
+
+/// Search for a node with the given key
+db_val_t db_search (struct dbt *table, db_key_t key)
 {
-    struct dbn *p;
+    struct dbn *p = table->ht[table_hash (table, key) % HASH_SIZE];
 
-    for (p = table->ht[table->hash (table, key) % HASH_SIZE]; p;)
+    while (p)
     {
-        int  c = table->cmp (table, key, p->key);
+        int  c = table_cmp (table, key, p->key);
         if (c == 0)
             return p->data;
         if (c < 0)
@@ -130,52 +98,12 @@ void *db_search (struct dbt *table, void *key)
     return NULL;
 }
 
-void *db_search2 (struct dbt *table, const char *key)
-{
-    int  i, sp;
-    struct dbn *p, *pn, *stack[64];
-    int  slen = strlen (key);
-
-    for (i = 0; i < HASH_SIZE; i++)
-    {
-        if ((p = table->ht[i]) == NULL)
-            continue;
-        sp = 0;
-        while (1)
-        {
-            if (strncasecmp (key, p->key, slen) == 0)
-                return p->data;
-            if ((pn = p->left) != NULL)
-            {
-                if (p->right)
-                {
-                    stack[sp++] = p->right;
-                }
-                p = pn;
-            }
-            else
-            {
-                if (p->right)
-                {
-                    p = p->right;
-                }
-                else
-                {
-                    if (sp == 0)
-                        break;
-                    p = stack[--sp];
-                }
-            }
-        }
-    }
-    return 0;
-}
-
+// Tree maintainance methods
 static void db_rotate_left (struct dbn *p, struct dbn **root)
 {
     struct dbn *y = p->right;
     p->right = y->left;
-    if (y->left != 0)
+    if (y->left)
         y->left->parent = p;
     y->parent = p->parent;
 
@@ -193,7 +121,7 @@ static void db_rotate_right (struct dbn *p, struct dbn **root)
 {
     struct dbn *y = p->left;
     p->left = y->right;
-    if (y->right != 0)
+    if (y->right)
         y->right->parent = p;
     y->parent = p->parent;
 
@@ -211,7 +139,7 @@ static void db_rebalance (struct dbn *p, struct dbn **root)
 {
     p->color = RED;
     while (p != *root && p->parent->color == RED)
-    {                           // rootは必ず黒で親は赤いので親の親は必ず存在する
+    {
         if (p->parent == p->parent->parent->left)
         {
             struct dbn *y = p->parent->parent->right;
@@ -260,23 +188,26 @@ static void db_rebalance (struct dbn *p, struct dbn **root)
     (*root)->color = BLACK;
 }
 
+// param z = node to remove
 static void db_rebalance_erase (struct dbn *z, struct dbn **root)
 {
-    struct dbn *y = z, *x = NULL, *x_parent = NULL;
+    struct dbn *y = z;
+    struct dbn *x = NULL;
 
-    if (y->left == NULL)
+    if (!y->left)
         x = y->right;
-    else if (y->right == NULL)
+    else if (!y->right)
         x = y->left;
     else
     {
         y = y->right;
-        while (y->left != NULL)
+        while (y->left)
             y = y->left;
         x = y->right;
     }
+    struct dbn *x_parent = NULL;
     if (y != z)
-    {                           // 左右が両方埋まっていた時 yをzの位置に持ってきてzを浮かせる
+    {
         z->left->parent = y;
         y->left = z->left;
         if (y != z->right)
@@ -305,7 +236,7 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
         y = z;
     }
     else
-    {                           // どちらか空いていた場合 xをzの位置に持ってきてzを浮かせる
+    {
         x_parent = y->parent;
         if (x)
             x->parent = y->parent;
@@ -316,10 +247,9 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
         else
             z->parent->right = x;
     }
-    // ここまで色の移動の除いて通常の2分木と同じ
     if (y->color != RED)
-    {                           // 赤が消える分には影響無し
-        while (x != *root && (x == NULL || x->color == BLACK))
+    {
+        while (x != *root && (!x || x->color == BLACK))
             if (x == x_parent->left)
             {
                 struct dbn *w = x_parent->right;
@@ -330,17 +260,16 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
                     db_rotate_left (x_parent, root);
                     w = x_parent->right;
                 }
-                if ((w->left == NULL ||
-                     w->left->color == BLACK) &&
-                    (w->right == NULL || w->right->color == BLACK))
+                if ((!w->left || w->left->color == BLACK) &&
+                    (!w->right || w->right->color == BLACK))
                 {
                     w->color = RED;
                     x = x_parent;
-                    x_parent = x_parent->parent;
+                    x_parent = x->parent;
                 }
                 else
                 {
-                    if (w->right == NULL || w->right->color == BLACK)
+                    if (!w->right|| w->right->color == BLACK)
                     {
                         if (w->left)
                             w->left->color = BLACK;
@@ -357,7 +286,8 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
                 }
             }
             else
-            {                   // same as above, with right <-> left.
+            {
+                // same as above, with right <-> left.
                 struct dbn *w = x_parent->left;
                 if (w->color == RED)
                 {
@@ -366,9 +296,8 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
                     db_rotate_right (x_parent, root);
                     w = x_parent->left;
                 }
-                if ((w->right == NULL ||
-                     w->right->color == BLACK) &&
-                    (w->left == NULL || w->left->color == BLACK))
+                if ((!w->right || w->right->color == BLACK) &&
+                    (!w->left || w->left->color == BLACK))
                 {
                     w->color = RED;
                     x = x_parent;
@@ -376,7 +305,7 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
                 }
                 else
                 {
-                    if (w->left == NULL || w->left->color == BLACK)
+                    if (!w->left || w->left->color == BLACK)
                     {
                         if (w->right)
                             w->right->color = BLACK;
@@ -397,46 +326,33 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
     }
 }
 
-struct dbn *db_insert (struct dbt *table, void *key, void *data)
+struct dbn *db_insert (struct dbt *table, db_key_t key, db_val_t data)
 {
-    struct dbn *p, *priv;
-    int  c, hash;
-
-    hash = table->hash (table, key) % HASH_SIZE;
-    for (c = 0, priv = NULL, p = table->ht[hash]; p;)
+    hash_t hash = table_hash (table, key) % HASH_SIZE;
+    int c = 0;
+    struct dbn *prev = NULL;
+    struct dbn *p = table->ht[hash];
+    while (p)
     {
-        c = table->cmp (table, key, p->key);
+        c = table_cmp (table, key, p->key);
         if (c == 0)
-        {                       // replace
+        {
+            // key found in table, replace
+            // Tell the user of the table to free the key and value
             if (table->release)
-                table->release (p, 3);
+                table->release (p->key, p->data);
             p->data = data;
             p->key = key;
             return p;
         }
-        priv = p;
+        // prev is always p->parent?
+        prev = p;
         if (c < 0)
-        {
             p = p->left;
-        }
         else
-        {
             p = p->right;
-        }
     }
-#ifdef MALLOC_DBN
-    p = malloc_dbn ();
-#else
     CREATE (p, struct dbn, 1);
-#endif
-    if (p == NULL)
-    {
-        printf ("out of memory : db_insert\n");
-        return NULL;
-    }
-    p->parent = NULL;
-    p->left = NULL;
-    p->right = NULL;
     p->key = key;
     p->data = data;
     p->color = RED;
@@ -444,37 +360,28 @@ struct dbn *db_insert (struct dbt *table, void *key, void *data)
     {                           // hash entry is empty
         table->ht[hash] = p;
         p->color = BLACK;
+        return p;
     }
+    p->parent = prev;
+    if (c < 0)
+        prev->left = p;
     else
+        prev->right = p;
+    if (prev->color == RED)
     {
-        if (c < 0)
-        {                       // left node
-            priv->left = p;
-            p->parent = priv;
-        }
-        else
-        {                       // right node
-            priv->right = p;
-            p->parent = priv;
-        }
-        if (priv->color == RED)
-        {                       // must rebalance
-            db_rebalance (p, &table->ht[hash]);
-        }
+        // must rebalance
+        db_rebalance (p, &table->ht[hash]);
     }
     return p;
 }
 
-void *db_erase (struct dbt *table, void *key)
+db_val_t db_erase (struct dbt *table, db_key_t key)
 {
-    void *data;
-    struct dbn *p;
-    int  c, hash;
-
-    hash = table->hash (table, key) % HASH_SIZE;
-    for (c = 0, p = table->ht[hash]; p;)
+    hash_t hash = table_hash (table, key) % HASH_SIZE;
+    struct dbn *p = table->ht[hash];
+    while (p)
     {
-        c = table->cmp (table, key, p->key);
+        int c = table_cmp (table, key, p->key);
         if (c == 0)
             break;
         if (c < 0)
@@ -484,103 +391,156 @@ void *db_erase (struct dbt *table, void *key)
     }
     if (!p)
         return NULL;
-    data = p->data;
+    db_val_t data = p->data;
     db_rebalance_erase (p, &table->ht[hash]);
-#ifdef MALLOC_DBN
-    free_dbn (p);
-#else
     free (p);
-#endif
     return data;
 }
+#ifdef SMART_WALK_TREE
+static inline void db_walk_tree (bool dealloc, struct dbn* p, db_func_t func, va_list ap)
+{
+    if (!p)
+        return;
+    if (!dealloc && !func)
+    {
+        fprintf(stderr, "DEBUG: Must walk tree to either free or invoke a function.\n");
+        abort();
+    }
+    if (p->parent)
+    {
+        fprintf(stderr, "DEBUG: Root nodes must not have parents\n");
+        abort();
+    }
+    while (true)
+    {
+        // apply_func loop
+        if (func)
+            func (p->key, p->data, ap);
+        if (p->left)
+        {
+            // continue descending
+            p = p->left;
+            continue; //goto apply_func;
+        }
+        if (p->right)
+        {
+            // descending the other side
+            p = p->right;
+            continue; //goto apply_func;
+        }
+        while (true)
+        {
+            // backtrack loop
+            if (!p->parent)
+            {
+                if (dealloc)
+                    free (p);
+                // if we have already done both children, there is no more to do
+                return;
+            }
+            if (p->parent->left == p && p->parent->right)
+            {
+                // finished the left tree, now walk the right tree
+                p = p->parent->right;
+                if (dealloc)
+                    free (p->parent->left);
+                break; //goto apply_func;
+            }
+            // p->parent->right == p
+            // or p->parent->left == p but p->parent->right == NULL
+            // keep backtracking
+            p = p->parent;
+            if (dealloc)
+                free (p->right?:p->left);
+        } //backtrack loop
+    } // apply_func loop
+}
+#endif // SMART_WALK_TREE
 
-void db_foreach (struct dbt *table, int (*func) (void *, void *, va_list),
-                 ...)
+void db_foreach (struct dbt *table, db_func_t func, ...)
 {
-    int  i, sp;
-    // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫
-    struct dbn *p, *pn, *stack[64];
     va_list ap;
-
     va_start (ap, func);
-    for (i = 0; i < HASH_SIZE; i++)
+
+    for (int i = 0; i < HASH_SIZE; i++)
     {
-        if ((p = table->ht[i]) == NULL)
+#ifdef SMART_WALK_TREE
+        db_walk_tree (false, table->ht[i], func, ap);
+#else
+        struct dbn *p = table->ht[i];
+        if (!p)
             continue;
-        sp = 0;
+        struct dbn *stack[64];
+        int sp = 0;
         while (1)
         {
             func (p->key, p->data, ap);
-            if ((pn = p->left) != NULL)
+            struct dbn *pn = p->left;
+            if (pn)
             {
                 if (p->right)
-                {
                     stack[sp++] = p->right;
-                }
                 p = pn;
             }
-            else
+            else // pn == NULL, time to do the right branch
             {
                 if (p->right)
-                {
                     p = p->right;
-                }
                 else
                 {
                     if (sp == 0)
                         break;
                     p = stack[--sp];
                 }
-            }
-        }
-    }
+            } // if pn else if !pn
+        } // while true
+#endif // else ! SMART_WALK_TREE
+    } // for i
     va_end (ap);
 }
 
-void db_final (struct dbt *table, int (*func) (void *, void *, va_list), ...)
+// This function is suspiciously similar to the previous
+void db_final (struct dbt *table, db_func_t func, ...)
 {
-    int  i, sp;
-    struct dbn *p, *pn, *stack[64];
     va_list ap;
-
     va_start (ap, func);
-    for (i = 0; i < HASH_SIZE; i++)
+
+    for (int i = 0; i < HASH_SIZE; i++)
     {
-        if ((p = table->ht[i]) == NULL)
+#ifdef SMART_WALK_TREE
+        db_walk_tree (true, table->ht[i], func, ap);
+#else
+        struct dbn *p = table->ht[i];
+        if (!p)
             continue;
-        sp = 0;
+        struct dbn *stack[64];
+        int sp = 0;
         while (1)
         {
             if (func)
                 func (p->key, p->data, ap);
-            if ((pn = p->left) != NULL)
+            struct dbn *pn = p->left;
+            if (pn)
             {
                 if (p->right)
-                {
                     stack[sp++] = p->right;
-                }
             }
-            else
+            else // pn == NULL, check the right
             {
                 if (p->right)
-                {
                     pn = p->right;
-                }
                 else
                 {
                     if (sp == 0)
                         break;
                     pn = stack[--sp];
                 }
-            }
-#ifdef MALLOC_DBN
-            free_dbn (p);
-#else
+            } // if pn else if !pn
             free (p);
-#endif
             p = pn;
-        }
-    }
+        } // while true
+#endif // else ! SMART_WALK_TREE
+    } // for i
     free (table);
     va_end (ap);
 }
diff --git a/src/common/db.h b/src/common/db.h
index 8de32d5..7152854 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -1,49 +1,87 @@
-#ifndef _DB_H_
-#define _DB_H_
+// WARNING: there is a system header by this name
+#ifndef DB_H
+#define DB_H
+# include "sanity.h"
 
-#include <stdarg.h>
+# include <stdarg.h>
 
-#define HASH_SIZE (256+27)
+/// Number of tree roots
+// Somewhat arbitrary - larger wastes more space but is faster for large trees
+// num % HASH_SIZE minimize collisions even for similar num
+# define HASH_SIZE (256+27)
 
-#define RED 0
-#define BLACK 1
+typedef enum dbn_color
+{
+    RED,
+    BLACK
+} dbn_color;
+
+typedef intptr_t numdb_key_t;
+typedef union db_key_t
+{
+    char *ms __attribute__((deprecated));
+    const char* s;
+    numdb_key_t i;
+} db_key_t;
+typedef void* db_val_t;
+typedef uint32_t hash_t;
+typedef void (*db_func_t)(db_key_t, db_val_t, va_list);
 
+/// DataBase Node
 struct dbn
 {
     struct dbn *parent, *left, *right;
-    int  color;
-    void *key;
-    void *data;
+    dbn_color color;
+    db_key_t key;
+    db_val_t data;
 };
 
+typedef enum dbt_type
+{
+    DB_NUMBER,
+    DB_STRING,
+} dbt_type;
+
+/// DataBase Table
 struct dbt
 {
-    int  (*cmp) (struct dbt *, void *, void *);
-    unsigned int (*hash) (struct dbt *, void *);
-    // which 1 - key,   2 - data,  3 - both
-    void (*release) (struct dbn *, int which);
-    int  maxlen;
+    dbt_type type;
+    /// Note, before replacement, key/values to be replaced
+    // TODO refactor to decrease/eliminate the uses of this?
+    void (*release) (db_key_t, db_val_t) __attribute__((deprecated));
+    /// Maximum length of a string key - TODO refactor to ensure all strings are NUL-terminated
+    size_t maxlen __attribute__((deprecated));
+    /// The root trees
     struct dbn *ht[HASH_SIZE];
 };
 
-#define strdb_search(t,k)   db_search((t),(void*)(k))
-#define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define strdb_erase(t,k)    db_erase ((t),(void*)(k))
-#define strdb_foreach       db_foreach
-#define strdb_final         db_final
-#define numdb_search(t,k)   db_search((t),(void*)(k))
-#define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define numdb_erase(t,k)    db_erase ((t),(void*)(k))
-#define numdb_foreach       db_foreach
-#define numdb_final         db_final
-
-struct dbt *strdb_init (int maxlen);
+# define strdb_search(t,k)   db_search((t),(db_key_t)(k))
+# define strdb_insert(t,k,d) db_insert((t),(db_key_t)(k),(db_val_t)(d))
+# define strdb_erase(t,k)    db_erase ((t),(db_key_t)(k))
+# define strdb_foreach       db_foreach
+# define strdb_final         db_final
+# define numdb_search(t,k)   db_search((t),(db_key_t)(k))
+# define numdb_insert(t,k,d) db_insert((t),(db_key_t)(k),(db_val_t)(d))
+# define numdb_erase(t,k)    db_erase ((t),(db_key_t)(k))
+# define numdb_foreach       db_foreach
+# define numdb_final         db_final
+
+/// Create a map from char* to void*, with strings possibly not null-terminated
+struct dbt *strdb_init (size_t maxlen);
+/// Create a map from int to void*
 struct dbt *numdb_init (void);
-void *db_search (struct dbt *table, void *key);
-void *db_search2 (struct dbt *table, const char *key);  // [MouseJstr]
-struct dbn *db_insert (struct dbt *table, void *key, void *data);
-void *db_erase (struct dbt *table, void *key);
-void db_foreach (struct dbt *, int (*)(void *, void *, va_list), ...);
-void db_final (struct dbt *, int (*)(void *, void *, va_list), ...);
+/// Return the value corresponding to the key, or NULL if not found
+db_val_t db_search (struct dbt *table, db_key_t key);
+/// Add or replace table[key] = data
+// if it was already there, call release
+struct dbn *db_insert (struct dbt *table, db_key_t key, db_val_t data);
+/// Remove a key from the table, returning the data
+db_val_t db_erase (struct dbt *table, db_key_t key);
+
+/// Execute a function for every element, in unspecified order
+void db_foreach (struct dbt *, db_func_t, ...);
+// opposite of init? Calls release for every element and frees memory
+// This probably isn't really needed: we don't have to free memory while exiting
+void db_final (struct dbt *, db_func_t, ...) __attribute__((deprecated));
 
 #endif
diff --git a/src/common/grfio.c b/src/common/grfio.c
index b460dc6..5e03b7c 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -1,1159 +1,212 @@
-/*********************************************************************
- *
- *		Ragnarok Online Emulator : grfio.c -- grf file I/O Module
- *--------------------------------------------------------------------
- *		special need library : zlib
- *********************************************************************
- *	$Id: grfio.c,v 1.2 2004/09/29 17:31:49 kalaspuff Exp $
- *
- *	2002/12/18... the original edition
- *	2003/01/23 ... Code correction
- *	2003/02/01 ... An addition and decryption processing are improved for LocalFile and two or more GRF(s) check processing.
- *	2003/02/02 ... Even if there is no grf it does not stop -- as -- correction
- *	2003/02/02... grf reading specification can be added later -- as -- correction (grfio_add function addition)
- *	2003/02 / 03... at the time of grfio_resourcecheck processing the entry addition processing method -- correction
- *	2003/02/05... change of the processing in grfio_init
- *	2003/02/23... a local file check -- GRFIO_LOCAL -- switch (Defoe -- Function Off)
- *      2003/10/21 ... The data of alpha client was read.
- *	2003/11/10 ... Ready new grf format.
- *	2003/11/11 ... version check fix & bug fix
- */
-
+// Reads .gat files by name-mapping .wlk files
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
 #include <sys/stat.h>
 
-#include <zlib.h>
-
 #include "utils.h"
 #include "grfio.h"
 #include "mmo.h"
 #include "socket.h"
 
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-typedef unsigned char BYTE;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-
-static char data_file[1024] = "";   // "data.grf";
-static char sdata_file[1024] = "";  // "sdata.grf";
-static char adata_file[1024] = "";  // "adata.grf";
-static char data_dir[1024] = "";    // "../";
-
-// accessor to data_file,adata_file,sdata_file
-char *grfio_setdatafile (const char *str)
-{
-    strcpy (data_file, str);
-    return data_file;
-}
-
-char *grfio_setadatafile (const char *str)
-{
-    strcpy (adata_file, str);
-    return adata_file;
-}
-
-char *grfio_setsdatafile (const char *str)
-{
-    strcpy (sdata_file, str);
-    return sdata_file;
-}
-
 //----------------------------
 //  file entry table struct
 //----------------------------
 typedef struct
 {
-    int  srclen;                // compressed size
-    int  srclen_aligned;        //
-    int  declen;                // original size
-    int  srcpos;
-    short next;
-    char cycle;
-    char type;
-    char fn[128 - 4 * 5];       // file name
-    char gentry;                // read grf file select
+    size_t declen;
+    int16_t next; // next index into the filelist[] array, or -1
+    char fn[128 - 4 - 2];       // file name
 } FILELIST;
-//gentry ... 0    : It acquires from a local file.
-//             It acquires from the resource file of 1>=:gentry_table[gentry-1].
-//             1<=: Check a local file.
-//                    If it is, after re-setting to 0, it acquires from a local file.
-//                    If there is nothing, mark reversal will be carried out, and it will re-set, and will acquire from a resource file as well as 1>=.
 
-//Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces.
+#define FILELIST_LIMIT  32768   // limit to number of filelists - if you increase this, change all shorts to int
+#define FILELIST_ADDS   1024    // amount to increment when reallocing
 
-#define	GENTRY_LIMIT	127
-#define	FILELIST_LIMIT	32768   // temporary maximum, and a theory top maximum are 2G.
+static FILELIST *filelist = NULL;
+/// Number of entries used
+static uint16_t filelist_entrys = 0;
+/// Number of FILELIST entries actually allocated
+static uint16_t filelist_maxentry = 0;
 
-static FILELIST *filelist;
-static int filelist_entrys;
-static int filelist_maxentry;
+/// First index of the given hash, into the filelist[] array
+static int16_t filelist_hash[256] = {[0 ... 255] = -1};
 
-static char **gentry_table;
-static int gentry_entrys;
-static int gentry_maxentry;
-
-//----------------------------
-//  file list hash table
-//----------------------------
-static int filelist_hash[256];
-
-//----------------------------
-//  grf decode data table
-//----------------------------
-static unsigned char BitMaskTable[8] = {
-    0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-static char BitSwapTable1[64] = {
-    58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
-    62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
-    57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
-    61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
-};
-
-static char BitSwapTable2[64] = {
-    40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
-    38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
-    36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
-    34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
-};
-
-static char BitSwapTable3[32] = {
-    16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
-    2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
-};
-
-static unsigned char NibbleData[4][64] = {
-    {
-     0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22,
-     0xb3, 0xd8, 0x84, 0x1e,
-     0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59,
-     0x05, 0x3b, 0x7a, 0x85,
-     0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f,
-     0x2d, 0x14, 0xb1, 0x72,
-     0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05,
-     0x52, 0x6e, 0x0f, 0xd9,
-     }, {
-         0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36,
-         0x4f, 0xf9, 0x60, 0x5a, 0xa3,
-         0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c,
-         0xba, 0x24, 0xfe, 0x8f, 0x19,
-         0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb,
-         0x91, 0x37, 0x8d, 0x0d, 0x78,
-         0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2,
-         0x57, 0xe8, 0x22, 0x74, 0xce,
-         }, {
-             0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2,
-             0x7c, 0xb6, 0xd9, 0x68, 0x15,
-             0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07,
-             0x9b, 0xe5, 0x83, 0x9b, 0x68,
-             0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8,
-             0xe5, 0x7c, 0x2f, 0x83, 0xda,
-             0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d,
-             0x40, 0x0b, 0x58, 0xe6, 0x3d,
-             }, {
-                 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a,
-                 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4,
-                 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20,
-                 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62,
-                 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14,
-                 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d,
-                 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3,
-                 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb,
-                 }
-};
-
-/*-----------------
- *	long data get
- */
-static unsigned int getlong (unsigned char *p)
+/// Hash a filename
+static uint8_t filehash (const char *fname)
 {
-    return *p + p[1] * 256 + (p[2] + p[3] * 256) * 65536;
-}
-
-/*==========================================
- *	Grf data decode : Subs
- *------------------------------------------
- */
-static void NibbleSwap (BYTE * Src, int len)
-{
-    for (; 0 < len; len--, Src++)
-    {
-        *Src = (*Src >> 4) | (*Src << 4);
-    }
-}
-
-static void BitConvert (BYTE * Src, char *BitSwapTable)
-{
-    int  lop, prm;
-    BYTE tmp[8];
-    *(DWORD *) tmp = *(DWORD *) (tmp + 4) = 0;
-    for (lop = 0; lop != 64; lop++)
-    {
-        prm = BitSwapTable[lop] - 1;
-        if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7])
-        {
-            tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7];
-        }
-    }
-    *(DWORD *) Src = *(DWORD *) tmp;
-    *(DWORD *) (Src + 4) = *(DWORD *) (tmp + 4);
-}
-
-static void BitConvert4 (BYTE * Src)
-{
-    int  lop, prm;
-    BYTE tmp[8];
-    tmp[0] = ((Src[7] << 5) | (Src[4] >> 3)) & 0x3f;    // ..0 vutsr
-    tmp[1] = ((Src[4] << 1) | (Src[5] >> 7)) & 0x3f;    // ..srqpo n
-    tmp[2] = ((Src[4] << 5) | (Src[5] >> 3)) & 0x3f;    // ..o nmlkj
-    tmp[3] = ((Src[5] << 1) | (Src[6] >> 7)) & 0x3f;    // ..kjihg f
-    tmp[4] = ((Src[5] << 5) | (Src[6] >> 3)) & 0x3f;    // ..g fedcb
-    tmp[5] = ((Src[6] << 1) | (Src[7] >> 7)) & 0x3f;    // ..cba98 7
-    tmp[6] = ((Src[6] << 5) | (Src[7] >> 3)) & 0x3f;    // ..8 76543
-    tmp[7] = ((Src[7] << 1) | (Src[4] >> 7)) & 0x3f;    // ..43210 v
-
-    for (lop = 0; lop != 4; lop++)
-    {
-        tmp[lop] = (NibbleData[lop][tmp[lop * 2]] & 0xf0)
-            | (NibbleData[lop][tmp[lop * 2 + 1]] & 0x0f);
-    }
-
-    *(DWORD *) (tmp + 4) = 0;
-    for (lop = 0; lop != 32; lop++)
-    {
-        prm = BitSwapTable3[lop] - 1;
-        if (tmp[prm >> 3] & BitMaskTable[prm & 7])
-        {
-            tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7];
-        }
-    }
-    *(DWORD *) Src ^= *(DWORD *) (tmp + 4);
-}
-
-static void decode_des_etc (BYTE * buf, int len, int type, int cycle)
-{
-    int  lop, cnt = 0;
-    if (cycle < 3)
-        cycle = 3;
-    else if (cycle < 5)
-        cycle++;
-    else if (cycle < 7)
-        cycle += 9;
-    else
-        cycle += 15;
-
-    for (lop = 0; lop * 8 < len; lop++, buf += 8)
-    {
-        if (lop < 20 || (type == 0 && lop % cycle == 0))
-        {                       // des
-            BitConvert (buf, BitSwapTable1);
-            BitConvert4 (buf);
-            BitConvert (buf, BitSwapTable2);
-        }
-        else
-        {
-            if (cnt == 7 && type == 0)
-            {
-                int  a;
-                BYTE tmp[8];
-                *(DWORD *) tmp = *(DWORD *) buf;
-                *(DWORD *) (tmp + 4) = *(DWORD *) (buf + 4);
-                cnt = 0;
-                buf[0] = tmp[3];
-                buf[1] = tmp[4];
-                buf[2] = tmp[6];
-                buf[3] = tmp[0];
-                buf[4] = tmp[1];
-                buf[5] = tmp[2];
-                buf[6] = tmp[5];
-                a = tmp[7];
-                if (a == 0x00)
-                    a = 0x2b;
-                else if (a == 0x2b)
-                    a = 0x00;
-                else if (a == 0x01)
-                    a = 0x68;
-                else if (a == 0x68)
-                    a = 0x01;
-                else if (a == 0x48)
-                    a = 0x77;
-                else if (a == 0x77)
-                    a = 0x48;
-                else if (a == 0x60)
-                    a = 0xff;
-                else if (a == 0xff)
-                    a = 0x60;
-                else if (a == 0x6c)
-                    a = 0x80;
-                else if (a == 0x80)
-                    a = 0x6c;
-                else if (a == 0xb9)
-                    a = 0xc0;
-                else if (a == 0xc0)
-                    a = 0xb9;
-                else if (a == 0xeb)
-                    a = 0xfe;
-                else if (a == 0xfe)
-                    a = 0xeb;
-                buf[7] = a;
-            }
-            cnt++;
-        }
-    }
-}
-
-/*==========================================
- *	Grf data decode sub : zip
- *------------------------------------------
- */
-static int decode_zip (Bytef * dest, uLongf * destLen, const Bytef * source,
-                       uLong sourceLen)
-{
-    z_stream stream;
-    int  err;
-
-    stream.next_in = (Bytef *) source;
-    stream.avail_in = (uInt) sourceLen;
-    /* Check for source > 64K on 16-bit machine: */
-    if ((uLong) stream.avail_in != sourceLen)
-        return Z_BUF_ERROR;
-
-    stream.next_out = dest;
-    stream.avail_out = (uInt) * destLen;
-    if ((uLong) stream.avail_out != *destLen)
-        return Z_BUF_ERROR;
-
-    stream.zalloc = (alloc_func) 0;
-    stream.zfree = (free_func) 0;
-
-    err = inflateInit (&stream);
-    if (err != Z_OK)
-        return err;
-
-    err = inflate (&stream, Z_FINISH);
-    if (err != Z_STREAM_END)
-    {
-        inflateEnd (&stream);
-        return err == Z_OK ? Z_BUF_ERROR : err;
-    }
-    *destLen = stream.total_out;
-
-    err = inflateEnd (&stream);
-    return err;
-}
-
-/***********************************************************
- ***                File List Sobroutines                ***
- ***********************************************************/
-
-/*==========================================
- *	File List : Hash make
- *------------------------------------------
- */
-static int filehash (unsigned char *fname)
-{
-    unsigned int hash = 0;
+    // Larger than the return type - upper bits are used in the process
+    uint32_t hash = 0;
     while (*fname)
     {
-        hash = ((hash << 1) + (hash >> 7) * 9 + tolower (*fname));
+        hash = (hash << 1) + (hash >> 7) * 9 + (unsigned char)*fname;
         fname++;
     }
-    return hash & 255;
-}
-
-/*==========================================
- *	File List : Hash initalize
- *------------------------------------------
- */
-static void hashinit (void)
-{
-    int  lop;
-    for (lop = 0; lop < 256; lop++)
-        filelist_hash[lop] = -1;
+    return hash;
 }
 
-/*==========================================
- *	File List : File find
- *------------------------------------------
- */
-FILELIST *filelist_find (char *fname)
+/// Find the filelist entry for the given filename, or NULL if it is not
+FILELIST *filelist_find (const char *fname)
 {
-    int  hash;
-
-    for (hash = filelist_hash[filehash (fname)]; hash >= 0;
-         hash = filelist[hash].next)
+    int16_t index = filelist_hash[filehash (fname)];
+    while (index >= 0)
     {
-        if (strcasecmp (filelist[hash].fn, fname) == 0)
-            break;
+        if (strcmp (filelist[index].fn, fname) == 0)
+            return &filelist[index];
+        index = filelist[index].next;
     }
-
-    return (hash >= 0) ? &filelist[hash] : NULL;
+    return NULL;
 }
 
-/*==========================================
- *	File List : Filelist add
- *------------------------------------------
- */
-#define	FILELIST_ADDS	1024    // number increment of file lists `
-
+/// Copy a temporary entry into the hash map
 static FILELIST *filelist_add (FILELIST * entry)
 {
-    int  hash;
-
     if (filelist_entrys >= FILELIST_LIMIT)
     {
-        printf ("filelist limit : filelist_add\n");
+        fprintf (stderr, "filelist limit : filelist_add\n");
         exit (1);
     }
 
     if (filelist_entrys >= filelist_maxentry)
     {
-        FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist,
-                                                       (filelist_maxentry +
-                                                        FILELIST_ADDS) *
-                                                       sizeof (FILELIST));
-        if (new_filelist != NULL)
-        {
-            filelist = new_filelist;
-            memset (filelist + filelist_maxentry, '\0',
-                    FILELIST_ADDS * sizeof (FILELIST));
-            filelist_maxentry += FILELIST_ADDS;
-        }
-        else
-        {
-            printf ("out of memory : filelist_add\n");
-            exit (1);
-        }
+        RECREATE(filelist, FILELIST, filelist_maxentry + FILELIST_ADDS);
+        memset (filelist + filelist_maxentry, '\0',
+                FILELIST_ADDS * sizeof (FILELIST));
+        filelist_maxentry += FILELIST_ADDS;
     }
 
-    memcpy (&filelist[filelist_entrys], entry, sizeof (FILELIST));
-
-    hash = filehash (entry->fn);
-    filelist[filelist_entrys].next = filelist_hash[hash];
-    filelist_hash[hash] = filelist_entrys;
+    uint16_t new_index = filelist_entrys++;
+    uint8_t hash = filehash (entry->fn);
+    entry->next = filelist_hash[hash];
+    filelist_hash[hash] = new_index;
 
-    filelist_entrys++;
+    filelist[new_index] = *entry;
 
-    return &filelist[filelist_entrys - 1];
+    return &filelist[new_index];
 }
 
 static FILELIST *filelist_modify (FILELIST * entry)
 {
-    FILELIST *fentry;
-    if ((fentry = filelist_find (entry->fn)) != NULL)
-    {
-        int  tmp = fentry->next;
-        memcpy (fentry, entry, sizeof (FILELIST));
-        fentry->next = tmp;
-    }
-    else
-    {
-        fentry = filelist_add (entry);
-    }
-    return fentry;
-}
-
-/*==========================================
- *	File List : filelist size adjust
- *------------------------------------------
- */
-static void filelist_adjust (void)
-{
-    if (filelist != NULL)
+    FILELIST *fentry = filelist_find (entry->fn);
+    if (fentry)
     {
-        if (filelist_maxentry > filelist_entrys)
-        {
-            FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist,
-                                                           filelist_entrys *
-                                                           sizeof (FILELIST));
-            if (new_filelist != NULL)
-            {
-                filelist = new_filelist;
-                filelist_maxentry = filelist_entrys;
-            }
-            else
-            {
-                printf ("out of memory : filelist\n");
-                exit (1);
-            }
-        }
+        entry->next = fentry->next;
+        *fentry = *entry;
+        return fentry;
     }
+    return filelist_add (entry);
 }
 
-/***********************************************************
- ***                  Grfio Sobroutines                  ***
- ***********************************************************/
-/*==========================================
- * Grfio : Resnametable replace
- *------------------------------------------
- */
-char *grfio_resnametable (char *fname, char *lfname)
+/// Change fname data/*.gat to lfname data/*.wlk
+// TODO even if the file exists, don't keep reopening it every time one loads
+void grfio_resnametable (const char *fname, char *lfname)
 {
-    FILE *fp;
-    char *p;
-    char w1[256], w2[256], restable[256], line[512];
-
-    sprintf (restable, "%sdata\\resnametable.txt", data_dir);
+    char restable[] = "data/resnametable.txt";
 
-    for (p = &restable[0]; *p != 0; p++)
-        if (*p == '\\')
-            *p = '/';
-
-    fp = fopen_ (restable, "rb");
+    FILE *fp = fopen_ (restable, "rb");
     if (fp == NULL)
     {
-        printf ("%s not found\n", restable);
-        exit (1);               // 1:not found error
+        fprintf(stderr, "No resnametable, can't look for %s\n", fname);
+        strcpy(lfname, fname);
+        char* ext = lfname + strlen(lfname) - 4;
+        if (!strcmp(ext, ".gat"))
+            strcpy(ext, ".wlk");
+        return;
     }
 
-    while (fgets (line, 508, fp))
+    char line[512];
+    while (fgets (line, sizeof (line), fp))
     {
-        if ((sscanf (line, "%[^#]#%[^#]#", w1, w2) == 2)
-            && (sscanf (fname, "%*5s%s", lfname) == 1)
-            && (!strcmpi (w1, lfname)))
+        char w1[256], w2[256];
+        if (
+            // line is of the form foo.gat#foo.wlk#
+            (sscanf (line, "%[^#]#%[^#]#", w1, w2) == 2)
+            // strip data/ from foo.gat before comparing
+            && (!strcmp (w1, fname + 5)))
         {
-            sprintf (lfname, "data\\%s", w2);
+            strcpy (lfname, "data/");
+            strcpy (lfname + 5, w2);
             fclose_ (fp);
-            return lfname;
+            return;
         }
     }
+    fprintf(stderr, "Unable to find resource: %s\n", fname);
     fclose_ (fp);
-    return fname;
-
-}
-
-/*==========================================
- *	Grfio : Resource file size get
- *------------------------------------------
- */
-int grfio_size (char *fname)
-{
-    FILELIST *entry;
-
-    entry = filelist_find (fname);
-
-    if (entry == NULL || entry->gentry < 0)
-    {                           // LocalFileCheck
-        char lfname[256], rname[256], *p;
-        FILELIST lentry;
-        struct stat st;
 
-        //printf("%s\t",fname);
-        sprintf (rname, "%s", grfio_resnametable (fname, lfname));
-        //printf("%s\n",rname);
-        sprintf (lfname, "%s%s", data_dir, rname);
-        //printf("%s\n",lfname);
-
-        for (p = &lfname[0]; *p != 0; p++)
-            if (*p == '\\')
-                *p = '/';       // * At the time of Unix
-
-        if (stat (lfname, &st) == 0)
-        {
-            strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
-            lentry.declen = st.st_size;
-            lentry.gentry = 0;  // 0:LocalFile
-            entry = filelist_modify (&lentry);
-        }
-        else if (entry == NULL)
-        {
-            printf ("%s not found\n", fname);
-            //exit(1);
-            return -1;
-        }
-    }
-    return entry->declen;
+    strcpy(lfname, fname);
+    char* ext = lfname + strlen(lfname) - 4;
+    if (!strcmp(ext, ".gat"))
+        strcpy(ext, ".wlk");
+    return;
 }
 
-/*==========================================
- *	Grfio : Resource file read & size get
- *------------------------------------------
- */
-void *grfio_reads (char *fname, int *size)
+/// Size of resource
+size_t grfio_size (const char *fname)
 {
-    FILE *in = NULL;
-    unsigned char *buf = NULL, *buf2 = NULL;
-    char *gfname;
-    FILELIST *entry;
+    FILELIST *entry = filelist_find (fname);
+    if (entry)
+        return entry->declen;
 
-    entry = filelist_find (fname);
+    char lfname[256];
+    FILELIST lentry;
+    struct stat st;
 
-    if (entry == NULL || entry->gentry <= 0)
-    {                           // LocalFileCheck
-        char lfname[256], rname[256], *p;
-        FILELIST lentry;
+    grfio_resnametable (fname, lfname);
 
-        strncpy (lfname, fname, 255);
-        sprintf (rname, "%s", grfio_resnametable (fname, lfname));
-        sprintf (lfname, "%s%s", data_dir, rname);
-        //printf("%s\n",lfname);
-
-        for (p = &lfname[0]; *p != 0; p++)
-            if (*p == '\\')
-                *p = '/';       // * At the time of Unix
-
-        in = fopen_ (lfname, "rb");
-        if (in != NULL)
-        {
-            if (entry != NULL && entry->gentry == 0)
-            {
-                lentry.declen = entry->declen;
-            }
-            else
-            {
-                fseek (in, 0, 2);   // SEEK_END
-                lentry.declen = ftell (in);
-            }
-            fseek (in, 0, 0);   // SEEK_SET
-            buf2 = calloc (lentry.declen + 1024, 1);
-            if (buf2 == NULL)
-            {
-                printf ("file read memory allocate error : declen\n");
-                goto errret;
-            }
-            if (!fread (buf2, 1, lentry.declen, in))
-                goto errret;
-            fclose_ (in);
-            in = NULL;
-            strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
-            lentry.gentry = 0;  // 0:LocalFile
-            entry = filelist_modify (&lentry);
-        }
-        else
-        {
-            if (entry != NULL && entry->gentry < 0)
-            {
-                entry->gentry = -entry->gentry; // local file checked
-            }
-            else
-            {
-                printf ("%s not found\n", fname);
-                //goto errret;
-                free (buf2);
-                return NULL;
-            }
-        }
-    }
-    if (entry != NULL && entry->gentry > 0)
-    {                           // Archive[GRF] File Read
-        buf = calloc (entry->srclen_aligned + 1024, 1);
-        if (buf == NULL)
-        {
-            printf ("file read memory allocate error : srclen_aligned\n");
-            goto errret;
-        }
-        gfname = gentry_table[entry->gentry - 1];
-        in = fopen_ (gfname, "rb");
-        if (in == NULL)
-        {
-            printf ("%s not found\n", gfname);
-            //goto errret;
-            free (buf);
-            return NULL;
-        }
-        fseek (in, entry->srcpos, 0);
-        if (!fread (buf, 1, entry->srclen_aligned, in))
-            goto errret;
-        fclose_ (in);
-        buf2 = calloc (entry->declen + 1024, 1);
-        if (buf2 == NULL)
-        {
-            printf ("file decode memory allocate error\n");
-            goto errret;
-        }
-        if (entry->type == 1 || entry->type == 3 || entry->type == 5)
-        {
-            uLongf len;
-            if (entry->cycle >= 0)
-            {
-                decode_des_etc (buf, entry->srclen_aligned, entry->cycle == 0,
-                                entry->cycle);
-            }
-            len = entry->declen;
-            decode_zip (buf2, &len, buf, entry->srclen);
-            if (len != entry->declen)
-            {
-                printf ("decode_zip size miss match err: %d != %d\n",
-                        (int) len, entry->declen);
-                goto errret;
-            }
-        }
-        else
-        {
-            memcpy (buf2, buf, entry->declen);
-        }
-        free (buf);
-    }
-    if (size != NULL && entry != NULL)
-        *size = entry->declen;
-    return buf2;
-  errret:
-    if (buf != NULL)
-        free (buf);
-    if (buf2 != NULL)
-        free (buf2);
-    if (in != NULL)
-        fclose_ (in);
-    exit (1);                   //return NULL;
-}
-
-/*==========================================
- *	Grfio : Resource file read
- *------------------------------------------
- */
-void *grfio_read (char *fname)
-{
-    return grfio_reads (fname, NULL);
-}
-
-/*==========================================
- *	Resource filename decode
- *------------------------------------------
- */
-static unsigned char *decode_filename (unsigned char *buf, int len)
-{
-    int  lop;
-    for (lop = 0; lop < len; lop += 8)
-    {
-        NibbleSwap (&buf[lop], 8);
-        BitConvert (&buf[lop], BitSwapTable1);
-        BitConvert4 (&buf[lop]);
-        BitConvert (&buf[lop], BitSwapTable2);
-    }
-    return buf;
-}
-
-/*==========================================
- * Grfio : Entry table read
- *------------------------------------------
- */
-static int grfio_entryread (char *gfname, int gentry)
-{
-    FILE *fp;
-    int  grf_size, list_size;
-    unsigned char grf_header[0x2e];
-    int  lop, entry, entrys, ofs, grf_version;
-    unsigned char *fname;
-    unsigned char *grf_filelist;
+    for (char *p = lfname; *p; p++)
+        if (*p == '\\')
+            *p = '/';
 
-    fp = fopen_ (gfname, "rb");
-    if (fp == NULL)
+    if (stat (lfname, &st) == 0)
     {
-        printf ("%s not found\n", gfname);
-        return 1;               // 1:not found error
-    }
-
-    fseek (fp, 0, 2);           // SEEK_END
-    grf_size = ftell (fp);
-    fseek (fp, 0, 0);           // SEEK_SET
-    if (!fread (grf_header, 1, 0x2e, fp))
-        return 2;
-
-    if (strcmp (grf_header, "Master of Magic")
-        || fseek (fp, getlong (grf_header + 0x1e), 1))
-    {                           // SEEK_CUR
-        fclose_ (fp);
-        printf ("%s read error\n", gfname);
-        return 2;               // 2:file format error
-    }
-
-    grf_version = getlong (grf_header + 0x2a) >> 8;
-
-    if (grf_version == 0x01)
-    {                           //****** Grf version 01xx ******
-        list_size = grf_size - ftell (fp);
-        grf_filelist = calloc (list_size, 1);
-        if (grf_filelist == NULL)
-        {
-            fclose_ (fp);
-            printf ("out of memory : grf_filelist\n");
-            return 3;           // 3:memory alloc error
-        }
-        if (!fread (grf_filelist, 1, list_size, fp))
-            return 2;
-        fclose_ (fp);
-
-        entrys =
-            getlong (grf_header + 0x26) - getlong (grf_header + 0x22) - 7;
-
-        // Get an entry
-        for (entry = 0, ofs = 0; entry < entrys; entry++)
-        {
-            int  ofs2, srclen, srccount, type;
-            char *period_ptr;
-            FILELIST aentry;
-
-            ofs2 = ofs + getlong (grf_filelist + ofs) + 4;
-            type = grf_filelist[ofs2 + 12];
-            if (type != 0)
-            {                   // Directory Index ... skip
-                fname =
-                    decode_filename (grf_filelist + ofs + 6,
-                                     grf_filelist[ofs] - 6);
-                if (strlen (fname) > sizeof (aentry.fn) - 1)
-                {
-                    printf ("file name too long : %s\n", fname);
-                    free (grf_filelist);
-                    exit (1);
-                }
-                srclen = 0;
-                if ((period_ptr = rindex (fname, '.')) != NULL)
-                {
-                    for (lop = 0; lop < 4; lop++)
-                    {
-                        if (strcasecmp
-                            (period_ptr,
-                             ".gnd\0.gat\0.act\0.str" + lop * 5) == 0)
-                            break;
-                    }
-                    srclen =
-                        getlong (grf_filelist + ofs2) -
-                        getlong (grf_filelist + ofs2 + 8) - 715;
-                    if (lop == 4)
-                    {
-                        for (lop = 10, srccount = 1; srclen >= lop;
-                             lop = lop * 10, srccount++);
-                    }
-                    else
-                    {
-                        srccount = 0;
-                    }
-                }
-                else
-                {
-                    srccount = 0;
-                }
-
-                aentry.srclen = srclen;
-                aentry.srclen_aligned =
-                    getlong (grf_filelist + ofs2 + 4) - 37579;
-                aentry.declen = getlong (grf_filelist + ofs2 + 8);
-                aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e;
-                aentry.cycle = srccount;
-                aentry.type = type;
-                strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1);
-#ifdef	GRFIO_LOCAL
-                aentry.gentry = -(gentry + 1);  // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
-                aentry.gentry = gentry + 1; // With no first time LocalFileCheck
-#endif
-                filelist_modify (&aentry);
-            }
-            ofs = ofs2 + 17;
-        }
-        free (grf_filelist);
-
-    }
-    else if (grf_version == 0x02)
-    {                           //****** Grf version 02xx ******
-        unsigned char eheader[8];
-        unsigned char *rBuf;
-        uLongf rSize, eSize;
-
-        if (!fread (eheader, 1, 8, fp))
-            return 4;
-
-        rSize = getlong (eheader);  // Read Size
-        eSize = getlong (eheader + 4);  // Extend Size
-
-        if (rSize > grf_size - ftell (fp))
-        {
-            fclose_ (fp);
-            printf ("Illegal data format : grf compress entry size\n");
-            return 4;
-        }
-
-        rBuf = calloc (rSize, 1);   // Get a Read Size
-        if (rBuf == NULL)
-        {
-            fclose_ (fp);
-            printf ("out of memory : grf compress entry table buffer\n");
-            return 3;
-        }
-        grf_filelist = calloc (eSize, 1);   // Get a Extend Size
-        if (grf_filelist == NULL)
-        {
-            free (rBuf);
-            fclose_ (fp);
-            printf ("out of memory : grf extract entry table buffer\n");
-            return 3;
-        }
-
-        if (!fread (rBuf, 1, rSize, fp))
-            return 4;
-
-        fclose_ (fp);
-        decode_zip (grf_filelist, &eSize, rBuf, rSize); // Decode function
-        list_size = eSize;
-        free (rBuf);
-
-        entrys = getlong (grf_header + 0x26) - 7;
-
-        // Get an entry
-        for (entry = 0, ofs = 0; entry < entrys; entry++)
-        {
-            int  ofs2, srclen, srccount, type;
-            FILELIST aentry;
-
-            fname = grf_filelist + ofs;
-            if (strlen (fname) > sizeof (aentry.fn) - 1)
-            {
-                printf ("grf : file name too long : %s\n", fname);
-                free (grf_filelist);
-                exit (1);
-            }
-            ofs2 = ofs + strlen (grf_filelist + ofs) + 1;
-            type = grf_filelist[ofs2 + 12];
-            if (type == 1 || type == 3 || type == 5)
-            {
-                srclen = getlong (grf_filelist + ofs2);
-                if (grf_filelist[ofs2 + 12] == 3)
-                {
-                    for (lop = 10, srccount = 1; srclen >= lop;
-                         lop = lop * 10, srccount++);
-                }
-                else if (grf_filelist[ofs2 + 12] == 5)
-                {
-                    srccount = 0;
-                }
-                else
-                {               // if (grf_filelist[ofs2+12]==1) {
-                    srccount = -1;
-                }
-
-                aentry.srclen = srclen;
-                aentry.srclen_aligned = getlong (grf_filelist + ofs2 + 4);
-                aentry.declen = getlong (grf_filelist + ofs2 + 8);
-                aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e;
-                aentry.cycle = srccount;
-                aentry.type = type;
-                strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1);
-#ifdef	GRFIO_LOCAL
-                aentry.gentry = -(gentry + 1);  // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
-                aentry.gentry = gentry + 1; // With no first time LocalFileCheck
-#endif
-                filelist_modify (&aentry);
-            }
-            ofs = ofs2 + 17;
-        }
-        free (grf_filelist);
-
+        strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
+        lentry.declen = st.st_size;
+        entry = filelist_modify (&lentry);
     }
     else
-    {                           //****** Grf Other version ******
-        fclose_ (fp);
-        printf ("not support grf versions : %04x\n",
-                getlong (grf_header + 0x2a));
-        return 4;
-    }
-
-    filelist_adjust ();         // Unnecessary area release of filelist
-
-    return 0;                   // 0:no error
-}
-
-/*==========================================
- * Grfio : Resource file check
- *------------------------------------------
- */
-static void grfio_resourcecheck ()
-{
-    int  size;
-    unsigned char *buf, *ptr;
-    char w1[256], w2[256], src[256], dst[256];
-    FILELIST *entry;
-
-    buf = grfio_reads ("data\\resnametable.txt", &size);
-    buf[size] = 0;
-
-    for (ptr = buf; ptr - buf < size;)
     {
-        if (sscanf (ptr, "%[^#]#%[^#]#", w1, w2) == 2)
-        {
-            if (strstr (w2, "bmp"))
-            {
-                sprintf (src, "data\\texture\\%s", w1);
-                sprintf (dst, "data\\texture\\%s", w2);
-            }
-            else
-            {
-                sprintf (src, "data\\%s", w1);
-                sprintf (dst, "data\\%s", w2);
-            }
-            entry = filelist_find (dst);
-            if (entry != NULL)
-            {
-                FILELIST fentry;
-                memcpy (&fentry, entry, sizeof (FILELIST));
-                strncpy (fentry.fn, src, sizeof (fentry.fn) - 1);
-                filelist_modify (&fentry);
-            }
-            else
-            {
-                //printf("file not found in data.grf : %s < %s\n",dst,src);
-            }
-        }
-        ptr = strchr (ptr, '\n');   // Next line
-        if (!ptr)
-            break;
-        ptr++;
+        printf ("%s not found\n", fname);
+        return 0;
     }
-    free (buf);
-    filelist_adjust ();         // Unnecessary area release of filelist
+    return entry->declen;
 }
 
-/*==========================================
- * Grfio : Resource add
- *------------------------------------------
- */
-#define	GENTRY_ADDS	16          // The number increment of gentry_table entries
-
-int grfio_add (char *fname)
+void *grfio_reads (const char *fname, size_t *size)
 {
-    int  len, result;
-    char *buf;
-
-    if (gentry_entrys >= GENTRY_LIMIT)
-    {
-        printf ("gentrys limit : grfio_add\n");
-        exit (1);
-    }
+    char lfname[256];
+    grfio_resnametable (fname, lfname);
 
-    printf ("%s file reading...\n", fname);
+    for (char *p = &lfname[0]; *p != 0; p++)
+        if (*p == '\\')
+            *p = '/';       // * At the time of Unix
 
-    if (gentry_entrys >= gentry_maxentry)
+    FILE *in = fopen_ (lfname, "rb");
+    if (!in)
     {
-        char **new_gentry = (char **) realloc ((void *) gentry_table,
-                                               (gentry_maxentry +
-                                                GENTRY_ADDS) *
-                                               sizeof (char *));
-        if (new_gentry != NULL)
-        {
-            int  lop;
-            gentry_table = new_gentry;
-            gentry_maxentry += GENTRY_ADDS;
-            for (lop = gentry_entrys; lop < gentry_maxentry; lop++)
-                gentry_table[lop] = NULL;
-        }
-        else
-        {
-            printf ("out of memory : grfio_add\n");
-            exit (1);
-        }
-    }
-    len = strlen (fname);
-    buf = calloc (len + 1, 1);
-    if (buf == NULL)
-    {
-        printf ("out of memory : gentry\n");
-        exit (1);
+        fprintf (stderr, "%s not found\n", fname);
+        return NULL;
     }
-    strcpy (buf, fname);
-    gentry_table[gentry_entrys++] = buf;
-
-    result = grfio_entryread (fname, gentry_entrys - 1);
-
-    if (result == 0)
+    FILELIST lentry;
+    FILELIST *entry = filelist_find (fname);
+    if (entry)
     {
-        // Resource check
-        grfio_resourcecheck ();
+        lentry.declen = entry->declen;
     }
-
-    return result;
-}
-
-/*==========================================
- * Grfio : Finalize
- *------------------------------------------
- */
-void grfio_final (void)
-{
-    int  lop;
-
-    if (filelist != NULL)
-        free (filelist);
-    filelist = NULL;
-    filelist_entrys = filelist_maxentry = 0;
-
-    if (gentry_table != NULL)
+    else
     {
-        for (lop = 0; lop < gentry_entrys; lop++)
-        {
-            if (gentry_table[lop] != NULL)
-            {
-                free (gentry_table[lop]);
-            }
-        }
-        free (gentry_table);
+        fseek (in, 0, SEEK_END);
+        lentry.declen = ftell (in);
+        fseek (in, 0, SEEK_SET);
+        strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
+        entry = filelist_modify (&lentry);
     }
-    gentry_table = NULL;
-    gentry_entrys = gentry_maxentry = 0;
-}
-
-/*==========================================
- * Grfio : Initialize
- *------------------------------------------
- */
-void grfio_init (char *fname)
-{
-    FILE *data_conf;
-    char line[1024], w1[1024], w2[1024];
-    int  result = 0, result2 = 0, result3 = 0;
-
-    data_conf = fopen_ (fname, "r");
+    uint8_t *buf2;
+    CREATE (buf2, uint8_t, lentry.declen + 1024);
+    if (!fread (buf2, 1, lentry.declen, in))
+        exit(1);
+    fclose_ (in);
+    in = NULL;
 
-    // It will read, if there is grf-files.txt.
-    if (data_conf)
-    {
-        while (fgets (line, 1020, data_conf))
-        {
-            if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
-            {
-                if (strcmp (w1, "data") == 0)
-                    strcpy (data_file, w2);
-                else if (strcmp (w1, "sdata") == 0)
-                    strcpy (sdata_file, w2);
-                else if (strcmp (w1, "adata") == 0)
-                    strcpy (adata_file, w2);
-                else if (strcmp (w1, "data_dir") == 0)
-                    strcpy (data_dir, w2);
-            }
-        }
-
-        fclose_ (data_conf);
-        printf ("read %s done\n", fname);
-    }                           // end of reading grf-files.txt
-
-    hashinit ();                // hash table initialization
-
-    filelist = NULL;
-    filelist_entrys = filelist_maxentry = 0;
-    gentry_table = NULL;
-    gentry_entrys = gentry_maxentry = 0;
-    atexit (grfio_final);       // End processing definition
-
-    // Entry table reading
-
-    if (strcmp (data_file, "") != 0)    // If data directive exists in grf-files.txt (i.e. data_file is not equal to "")
-        result = grfio_add (data_file); // Primary data file
-
-    if (strcmp (sdata_file, "") != 0)   // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "")
-        result2 = grfio_add (sdata_file);   // Sakray data file
-
-    if (strcmp (adata_file, "") != 0)   // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "")
-        result3 = grfio_add (adata_file);   // Alpha version data file
-
-    if (result != 0 && result2 != 0 && result3 != 0)
-    {
-        printf ("not grf file readed exit!!\n");
-        exit (1);               // It ends, if a resource cannot read one.
-    }
+    if (size)
+        *size = entry->declen;
+    return buf2;
 }
diff --git a/src/common/grfio.h b/src/common/grfio.h
index 5d3f69c..4919a7b 100644
--- a/src/common/grfio.h
+++ b/src/common/grfio.h
@@ -1,16 +1,17 @@
-// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-#ifndef	_GRFIO_H_
-#define	_GRFIO_H_
+/// Accessor to the .gat map virtual files
+// Note .gat files are mapped to .wlk files by data/resnametable.txt
+// Note that there currently is a 1-1 correlation between them,
+// but it is possible for a single .wlk to have multiple .gats reference it
+#ifndef GRFIO_H
+#define GRFIO_H
 
-void grfio_init (char *);       // GRFIO Initialize
-int  grfio_add (char *);        // GRFIO Resource file add
-void *grfio_read (char *);      // GRFIO data file read
-void *grfio_reads (char *, int *);  // GRFIO data file read & size get
-int  grfio_size (char *);       // GRFIO data file size get
+/// Load file into memory
+# define grfio_read(resourcename) grfio_reads (resourcename, NULL)
+/// Load file into memory and possibly record length
+// For some reason, this allocates an extra 1024 bytes at the end
+void *grfio_reads (const char *resourcename, size_t *size);
+/// Get size of file
+// This is only called once, and that is to check the existence of a file.
+size_t grfio_size (const char *resourcename) __attribute__((deprecated));
 
-// Accessor to GRF filenames
-char *grfio_setdatafile (const char *str);
-char *grfio_setadatafile (const char *str);
-char *grfio_setsdatafile (const char *str);
-
-#endif // _GRFIO_H_
+#endif // GRFIO_H
diff --git a/src/common/lock.c b/src/common/lock.c
index bed657f..dd42ef2 100644
--- a/src/common/lock.c
+++ b/src/common/lock.c
@@ -1,45 +1,36 @@
-
 #include <unistd.h>
 #include <stdio.h>
 #include "lock.h"
 #include "socket.h"
 
-// 書き込みファイルの保護処理
-// (書き込みが終わるまで、旧ファイルを保管しておく)
+/// Protected file writing
+/// (Until the file is closed, it keeps the old file)
 
-// 新しいファイルの書き込み開始
+// Start writing a tmpfile
 FILE *lock_fopen (const char *filename, int *info)
 {
     char newfile[512];
     FILE *fp;
     int  no = getpid ();
 
-    // 安全なファイル名を得る(手抜き)
+    // Get a filename that doesn't already exist
     do
     {
         sprintf (newfile, "%s_%d.tmp", filename, no++);
     }
-    while ((fp = fopen_ (newfile, "r")) && fclose_ (fp));
+    while ((fp = fopen_ (newfile, "r")) && (fclose_ (fp), 1));
     *info = --no;
     return fopen_ (newfile, "w");
 }
 
-// 旧ファイルを削除&新ファイルをリネーム
-int lock_fclose (FILE * fp, const char *filename, int *info)
+// Delete the old file and rename the new file
+void lock_fclose (FILE * fp, const char *filename, int *info)
 {
-    int  ret = 0;
     char newfile[512];
-    if (fp != NULL)
+    if (fp)
     {
-        ret = fclose_ (fp);
+        fclose_ (fp);
         sprintf (newfile, "%s_%d.tmp", filename, *info);
-        remove (filename);
-        // このタイミングで落ちると最悪。
         rename (newfile, filename);
-        return ret;
-    }
-    else
-    {
-        return 1;
     }
 }
diff --git a/src/common/lock.h b/src/common/lock.h
index 6175241..2f087fd 100644
--- a/src/common/lock.h
+++ b/src/common/lock.h
@@ -1,7 +1,8 @@
-#ifndef _LOCK_H_
-#define _LOCK_H_
-
+#ifndef LOCK_H
+#define LOCK_H
+/// Locked FILE I/O
+// Changes are made in a separate file until lock_fclose
 FILE *lock_fopen (const char *filename, int *info);
-int  lock_fclose (FILE * fp, const char *filename, int *info);
+void lock_fclose (FILE * fp, const char *filename, int *info);
 
-#endif
+#endif // LOCK_H
diff --git a/src/common/malloc.c b/src/common/malloc.c
deleted file mode 100644
index 8d68bee..0000000
--- a/src/common/malloc.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "malloc.h"
-
-#define SHOW_MEMORY_ERROR(file, line, func, type, msg)                      \
-    fprintf (stderr, "%s:%d: in func %s(): %s() error, %s\n",               \
-             file, line, func, type, msg)
-
-void *aMalloc_ (size_t size, const char *file, int line, const char *func)
-{
-    void *ret = malloc (size);
-
-    /* printf ("%s:%d: in func %s(): malloc(%d)\n", file, line, func, size); */
-    if (ret == NULL)
-    {
-        SHOW_MEMORY_ERROR (file, line, func, "malloc", "out of memory");
-        exit (EXIT_FAILURE);
-    }
-
-    return ret;
-}
-
-void *aCalloc_ (size_t num, size_t size, const char *file, int line,
-                const char *func)
-{
-    void *ret = calloc (num, size);
-
-    /* printf ("%s:%d: in func %s(): calloc(%d, %d)\n", file, line, func, num, 
-               size); */
-    if (ret == NULL)
-    {
-        SHOW_MEMORY_ERROR (file, line, func, "calloc", "out of memory");
-        exit (EXIT_FAILURE);
-    }
-
-    return ret;
-}
-
-void *aRealloc_ (void *p, size_t size, const char *file, int line,
-                 const char *func)
-{
-    void *ret = realloc (p, size);
-
-    /* printf ("%s:%d: in func %s(): realloc(%p, %d)\n", file, line, func, p,
-               size); */
-    if (ret == NULL)
-    {
-        SHOW_MEMORY_ERROR (file, line, func, "realloc", "out of memory");
-        exit (EXIT_FAILURE);
-    }
-
-    return ret;
-}
-
-char *aStrdup_ (const char *p, const char *file, int line, const char *func)
-{
-    char *ret = strdup (p);
-
-    /* printf ("%s:%d: in func %s(): strdup(%p)\n", file, line, func, p); */
-    if (ret == NULL)
-    {
-        SHOW_MEMORY_ERROR (file, line, func, "strdup", "out of memory");
-        exit (EXIT_FAILURE);
-    }
-
-    return ret;
-}
diff --git a/src/common/malloc.h b/src/common/malloc.h
deleted file mode 100644
index 5fc8cbe..0000000
--- a/src/common/malloc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-#  define __func__ __FUNCTION__
-# else
-#  define __func__ ""
-# endif
-#endif
-
-#define ALC_MARK __FILE__, __LINE__, __func__
-
-void *aMalloc_ (size_t, const char *, int, const char *);
-void *aCalloc_ (size_t, size_t, const char *, int, const char *);
-void *aRealloc_ (void *, size_t, const char *, int, const char *);
-char *aStrdup_ (const char *, const char *, int, const char *);
-
-#define aMalloc(n) aMalloc_(n,ALC_MARK)
-#define aMallocA(n) aMalloc_(n,ALC_MARK)
-#define aCalloc(m,n) aCalloc_(m,n,ALC_MARK)
-#define aCallocA(m,n) aCalloc_(m,n,ALC_MARK)
-#define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
-#define aStrdup(p) aStrdup_(p,ALC_MARK)
-#define aFree(p) aFree_(p,ALC_MARK)
-
-#endif
diff --git a/src/common/md5calc.c b/src/common/md5calc.c
index 6069070..d5ebcf8 100644
--- a/src/common/md5calc.c
+++ b/src/common/md5calc.c
@@ -1,335 +1,310 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
 #include "md5calc.h"
 #include <string.h>
-#include <stdio.h>
 #include "mt_rand.h"
 
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
+// auxilary data
+/*
+sin() constant table
+# Reformatted output of:
+echo 'scale=40; obase=16; for (i=1;i<=64;i++) print 2^32 * sin(i), "\n"' |
+bc | sed 's/^-//;s/^/0x/;s/\..*$/,/'
+*/
+static const uint32_t T[64] =
+{
+    // used by round 1
     0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
     0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
     0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
     0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
+    // used by round 2
     0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
-    0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,  //20
+    0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, //20
     0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
     0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
+    // used by round 3
     0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
     0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
-    0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,  //40
+    0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, //40
     0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
+    // used by round 4
     0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
     0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
     0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
-    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391  //60
+    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, //60
 };
 
-// ROTATE_LEFT   The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+// auxilary functions
+// note - the RFC defines these by non-CS conventions: or=v, and=(empty)
+static inline uint32_t rotate_left(uint32_t val, unsigned shift)
+{
+    return val << shift | val >> (32-shift);
+}
 
-// The function used for other calculation
-static unsigned int F (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t F(uint32_t X, uint32_t Y, uint32_t Z)
 {
     return (X & Y) | (~X & Z);
 }
-
-static unsigned int G (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t G(uint32_t X, uint32_t Y, uint32_t Z)
 {
     return (X & Z) | (Y & ~Z);
 }
-
-static unsigned int H (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t H(uint32_t X, uint32_t Y, uint32_t Z)
 {
     return X ^ Y ^ Z;
 }
-
-static unsigned int I (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t I(uint32_t X, uint32_t Y, uint32_t Z)
 {
     return Y ^ (X | ~Z);
 }
 
-static unsigned int Round (unsigned int a, unsigned int b, unsigned int FGHI,
-                           unsigned int k, unsigned int s, unsigned int i)
+static const struct
 {
-    return b + ROTATE_LEFT (a + FGHI + pX[k] + T[i], s);
+    uint8_t k : 4;
+    uint8_t : 0;
+    uint8_t s : 5;
+//    uint8_t i : 6; just increments constantly, from 1 .. 64 over all rounds
 }
+MD5_round1[16] =
+{
+    { 0,  7}, { 1, 12}, { 2, 17}, { 3, 22},
+    { 4,  7}, { 5, 12}, { 6, 17}, { 7, 22},
+    { 8,  7}, { 9, 12}, {10, 17}, {11, 22},
+    {12,  7}, {13, 12}, {14, 17}, {15, 22},
+},
+MD5_round2[16] =
+{
+    { 1,  5}, { 6,  9}, {11, 14}, { 0, 20},
+    { 5,  5}, {10,  9}, {15, 14}, { 4, 20},
+    { 9,  5}, {14,  9}, { 3, 14}, { 8, 20},
+    {13,  5}, { 2,  9}, { 7, 14}, {12, 20},
+},
+MD5_round3[16] =
+{
+    { 5,  4}, { 8, 11}, {11, 16}, {14, 23},
+    { 1,  4}, { 4, 11}, { 7, 16}, {10, 23},
+    {13,  4}, { 0, 11}, { 3, 16}, { 6, 23},
+    { 9,  4}, {12, 11}, {15, 16}, { 2, 23},
+},
+MD5_round4[16] =
+{
+    { 0,  6}, { 7, 10}, {14, 15}, { 5, 21},
+    {12,  6}, { 3, 10}, {10, 15}, { 1, 21},
+    { 8,  6}, {15, 10}, { 6, 15}, {13, 21},
+    { 4,  6}, {11, 10}, { 2, 15}, { 9, 21},
+};
 
-static void Round1 (unsigned int *a, unsigned int b, unsigned int c,
-                    unsigned int d, unsigned int k, unsigned int s,
-                    unsigned int i)
+
+void MD5_init(MD5_state* state)
 {
-    *a = Round (*a, b, F (b, c, d), k, s, i);
+    // in the RFC, these are specified as bytes, interpreted as little-endian
+    state->val[0] = 0x67452301;
+    state->val[1] = 0xEFCDAB89;
+    state->val[2] = 0x98BADCFE;
+    state->val[3] = 0x10325476;
 }
 
-static void Round2 (unsigned int *a, unsigned int b, unsigned int c,
-                    unsigned int d, unsigned int k, unsigned int s,
-                    unsigned int i)
+void MD5_do_block(MD5_state* state, MD5_block block)
 {
-    *a = Round (*a, b, G (b, c, d), k, s, i);
+#define X block.data
+#define a state->val[(16-i)%4]
+#define b state->val[(17-i)%4]
+#define c state->val[(18-i)%4]
+#define d state->val[(19-i)%4]
+    // save the values
+    const MD5_state saved = *state;
+    // round 1
+    for (int i=0; i<16; i++)
+    {
+#define k MD5_round1[i].k
+#define s MD5_round1[i].s
+        a = b + rotate_left(a + F(b,c,d) + X[k] + T[i+0x0], s);
+#undef k
+#undef s
+    }
+    // round 2
+    for (int i=0; i<16; i++)
+    {
+#define k MD5_round2[i].k
+#define s MD5_round2[i].s
+        a = b + rotate_left(a + G(b,c,d) + X[k] + T[i+0x10], s);
+#undef k
+#undef s
+    }
+    // round 3
+    for (int i=0; i<16; i++)
+    {
+#define k MD5_round3[i].k
+#define s MD5_round3[i].s
+        a = b + rotate_left(a + H(b,c,d) + X[k] + T[i+0x20], s);
+#undef k
+#undef s
+    }
+    // round 4
+    for (int i=0; i<16; i++)
+    {
+#define k MD5_round4[i].k
+#define s MD5_round4[i].s
+        a = b + rotate_left(a + I(b,c,d) + X[k] + T[i+0x30], s);
+#undef k
+#undef s
+    }
+    // adjust state based on original
+    state->val[0] += saved.val[0];
+    state->val[1] += saved.val[1];
+    state->val[2] += saved.val[2];
+    state->val[3] += saved.val[3];
+#undef a
+#undef b
+#undef c
+#undef d
 }
 
-static void Round3 (unsigned int *a, unsigned int b, unsigned int c,
-                    unsigned int d, unsigned int k, unsigned int s,
-                    unsigned int i)
+void MD5_to_bin(MD5_state state, uint8_t out[0x10])
 {
-    *a = Round (*a, b, H (b, c, d), k, s, i);
+    for (int i=0; i<0x10; i++)
+        out[i] = state.val[i/4] >> 8*(i%4);
 }
 
-static void Round4 (unsigned int *a, unsigned int b, unsigned int c,
-                    unsigned int d, unsigned int k, unsigned int s,
-                    unsigned int i)
+static const char hex[0x10] = "0123456789abcdef";
+
+void MD5_to_str(MD5_state state, char out[0x21])
 {
-    *a = Round (*a, b, I (b, c, d), k, s, i);
+    uint8_t bin[16];
+    MD5_to_bin(state, bin);
+    for (int i=0; i<0x10; i++)
+        out[2*i] = hex[bin[i] >> 4],
+        out[2*i+1] = hex[bin[i] & 0xf];
+    out[0x20] = '\0';
 }
 
-static void MD5_Round_Calculate (const unsigned char *block,
-                                 unsigned int *A2, unsigned int *B2,
-                                 unsigned int *C2, unsigned int *D2)
+MD5_state MD5_from_string(const char* msg, const size_t msglen)
 {
-    //create X It is since it is required.
-    unsigned int X[16];         //512bit 64byte
-    int  j, k;
-
-    //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
-    unsigned int A = *A2, B = *B2, C = *C2, D = *D2;
-    unsigned int AA = A, BB = B, CC = C, DD = D;
-
-    //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
-    pX = X;
-
-    //Copy block(padding_message) i into X
-    for (j = 0, k = 0; j < 64; j += 4, k++)
-        X[k] = ((unsigned int) block[j])    // 8byte*4 -> 32byte conversion
-            | (((unsigned int) block[j + 1]) << 8)  // A function called Decode as used in the field of RFC
-            | (((unsigned int) block[j + 2]) << 16)
-            | (((unsigned int) block[j + 3]) << 24);
-
-    //Round 1
-    Round1 (&A, B, C, D, 0, 7, 0);
-    Round1 (&D, A, B, C, 1, 12, 1);
-    Round1 (&C, D, A, B, 2, 17, 2);
-    Round1 (&B, C, D, A, 3, 22, 3);
-    Round1 (&A, B, C, D, 4, 7, 4);
-    Round1 (&D, A, B, C, 5, 12, 5);
-    Round1 (&C, D, A, B, 6, 17, 6);
-    Round1 (&B, C, D, A, 7, 22, 7);
-    Round1 (&A, B, C, D, 8, 7, 8);
-    Round1 (&D, A, B, C, 9, 12, 9);
-    Round1 (&C, D, A, B, 10, 17, 10);
-    Round1 (&B, C, D, A, 11, 22, 11);
-    Round1 (&A, B, C, D, 12, 7, 12);
-    Round1 (&D, A, B, C, 13, 12, 13);
-    Round1 (&C, D, A, B, 14, 17, 14);
-    Round1 (&B, C, D, A, 15, 22, 15);
-
-    //Round 2
-    Round2 (&A, B, C, D, 1, 5, 16);
-    Round2 (&D, A, B, C, 6, 9, 17);
-    Round2 (&C, D, A, B, 11, 14, 18);
-    Round2 (&B, C, D, A, 0, 20, 19);
-    Round2 (&A, B, C, D, 5, 5, 20);
-    Round2 (&D, A, B, C, 10, 9, 21);
-    Round2 (&C, D, A, B, 15, 14, 22);
-    Round2 (&B, C, D, A, 4, 20, 23);
-    Round2 (&A, B, C, D, 9, 5, 24);
-    Round2 (&D, A, B, C, 14, 9, 25);
-    Round2 (&C, D, A, B, 3, 14, 26);
-    Round2 (&B, C, D, A, 8, 20, 27);
-    Round2 (&A, B, C, D, 13, 5, 28);
-    Round2 (&D, A, B, C, 2, 9, 29);
-    Round2 (&C, D, A, B, 7, 14, 30);
-    Round2 (&B, C, D, A, 12, 20, 31);
-
-    //Round 3
-    Round3 (&A, B, C, D, 5, 4, 32);
-    Round3 (&D, A, B, C, 8, 11, 33);
-    Round3 (&C, D, A, B, 11, 16, 34);
-    Round3 (&B, C, D, A, 14, 23, 35);
-    Round3 (&A, B, C, D, 1, 4, 36);
-    Round3 (&D, A, B, C, 4, 11, 37);
-    Round3 (&C, D, A, B, 7, 16, 38);
-    Round3 (&B, C, D, A, 10, 23, 39);
-    Round3 (&A, B, C, D, 13, 4, 40);
-    Round3 (&D, A, B, C, 0, 11, 41);
-    Round3 (&C, D, A, B, 3, 16, 42);
-    Round3 (&B, C, D, A, 6, 23, 43);
-    Round3 (&A, B, C, D, 9, 4, 44);
-    Round3 (&D, A, B, C, 12, 11, 45);
-    Round3 (&C, D, A, B, 15, 16, 46);
-    Round3 (&B, C, D, A, 2, 23, 47);
-
-    //Round 4
-    Round4 (&A, B, C, D, 0, 6, 48);
-    Round4 (&D, A, B, C, 7, 10, 49);
-    Round4 (&C, D, A, B, 14, 15, 50);
-    Round4 (&B, C, D, A, 5, 21, 51);
-    Round4 (&A, B, C, D, 12, 6, 52);
-    Round4 (&D, A, B, C, 3, 10, 53);
-    Round4 (&C, D, A, B, 10, 15, 54);
-    Round4 (&B, C, D, A, 1, 21, 55);
-    Round4 (&A, B, C, D, 8, 6, 56);
-    Round4 (&D, A, B, C, 15, 10, 57);
-    Round4 (&C, D, A, B, 6, 15, 58);
-    Round4 (&B, C, D, A, 13, 21, 59);
-    Round4 (&A, B, C, D, 4, 6, 60);
-    Round4 (&D, A, B, C, 11, 10, 61);
-    Round4 (&C, D, A, B, 2, 15, 62);
-    Round4 (&B, C, D, A, 9, 21, 63);
-
-    // Then perform the following additions. (let's add)
-    *A2 = A + AA;
-    *B2 = B + BB;
-    *C2 = C + CC;
-    *D2 = D + DD;
-
-    //The clearance of confidential information
-    memset (pX, 0, sizeof (X));
+    MD5_state state;
+    MD5_init(&state);
+    MD5_block block;
+    size_t rem = msglen;
+    while (rem >= 64)
+    {
+        for (int i=0; i<0x10; i++)
+            X[i] = msg[4*i+0] | msg[4*i+1]<<8 | msg[4*i+2]<<16 | msg[4*i+3]<<24;
+        MD5_do_block(&state, block);
+        msg += 64;
+        rem -= 64;
+    }
+    // now pad 1-512 bits + the 64-bit length - may be two blocks
+    uint8_t buf[0x40] = {};
+    memcpy (buf, msg, rem);
+    buf[rem] = 0x80; // a single one bit
+    if (64 - rem > 8)
+    {
+        for (int i=0; i<8; i++)
+            buf[0x38+i] = (msglen*8) >> (i*8);
+    }
+    for (int i=0; i<0x10; i++)
+        X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+    MD5_do_block(&state, block);
+    if (64 - rem <= 8)
+    {
+        memset(buf,'\0', 0x38);
+        for (int i=0; i<8; i++)
+            buf[0x38+i] = (msglen*8) >> (i*8);
+        for (int i=0; i<0x10; i++)
+            X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+        MD5_do_block(&state, block);
+    }
+    return state;
 }
 
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary (const char *string, char *output)
+// This could be reimplemented without the strlen()
+MD5_state MD5_from_cstring(const char* msg)
 {
-//var
-    /*8bit */
-    unsigned char padding_message[64];  //Extended message   512bit 64byte
-    unsigned char *pstring;     //The position of string in the present scanning notes is held.
-
-//   unsigned char digest[16];
-    /*32bit */
-    unsigned int string_byte_len,   //The byte chief of string is held.
-         string_bit_len,        //The bit length of string is held.
-         copy_len,              //The number of bytes which is used by 1-3 and which remained
-         msg_digest[4];         //Message digest   128bit 4byte
-    unsigned int *A = &msg_digest[0],   //The message digest in accordance with RFC (reference)
-        *B = &msg_digest[1], *C = &msg_digest[2], *D = &msg_digest[3];
-    int  i;
+    return MD5_from_string(msg, strlen(msg));
+}
 
-//prog
-    //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
-    *A = 0x67452301;
-    *B = 0xefcdab89;
-    *C = 0x98badcfe;
-    *D = 0x10325476;
+MD5_state MD5_from_FILE(FILE* in) {
+    uint64_t total_len = 0;
 
-    //Step 1.Append Padding Bits (extension of a mark bit)
-    //1-1
-    string_byte_len = strlen (string);  //The byte chief of a character sequence is acquired.
-    pstring = (unsigned char *) string; //The position of the present character sequence is set.
+    uint8_t buf[0x40];
+    uint8_t block_len = 0;
 
-    //1-2  Repeat calculation until length becomes less than 64 bytes.
-    for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64)
-        MD5_Round_Calculate (pstring, A, B, C, D);
+    MD5_state state;
+    MD5_init(&state);
 
-    //1-3
-    copy_len = string_byte_len % 64;    //The number of bytes which remained is computed.
-    strncpy ((char *) padding_message, (char *) pstring, copy_len); //A message is copied to an extended bit sequence.
-    memset (padding_message + copy_len, 0, 64 - copy_len);  //It buries by 0 until it becomes extended bit length.
-    padding_message[copy_len] |= 0x80;  //The next of a message is 1.
+    MD5_block block;
 
-    //1-4 
-    //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
-    if (56 <= copy_len)
+    while (true)
     {
-        MD5_Round_Calculate (padding_message, A, B, C, D);
-        memset (padding_message, 0, 56);    //56 bytes is newly fill uped with 0.
+        size_t rv = fread(buf + block_len, 1, 0x40 - block_len, in);
+        if (!rv)
+            break;
+        total_len += 8*rv; // in bits
+        block_len += rv;
+        if (block_len != 0x40)
+            continue;
+        for (int i=0; i<0x10; i++)
+            X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+        MD5_do_block(&state, block);
+        block_len = 0;
     }
-
-    //Step 2.Append Length (the information on length is added)
-    string_bit_len = string_byte_len * 8;   //From the byte chief to bit length (32 bytes of low rank)
-    memcpy (&padding_message[56], &string_bit_len, 4);  //32 bytes of low rank is set.
-
-    //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
-    if (UINT_MAX / 8 < string_byte_len)
+    // no more input, just pad and append the length
+    buf[block_len] = 0x80;
+    memset(buf + block_len + 1, '\0', 0x40 - block_len - 1);
+    if (block_len < 0x38)
     {
-        unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
-        memcpy (&padding_message[60], &high, 4);
+        for (int i=0; i<8; i++)
+            buf[0x38+i] = total_len >> i*8;
     }
-    else
-        memset (&padding_message[60], 0, 4);    //In this case, it is good for a higher rank at 0.
-
-    //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
-    MD5_Round_Calculate (padding_message, A, B, C, D);
-
-    //Step 5.Output (output)
-    memcpy (output, msg_digest, 16);
-//   memcpy (digest, msg_digest, and 16);  //8 byte*4 < - 32byte conversion   A function called Encode as used in the field of RFC
-/*   sprintf(output,
-           "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
-           digest[ 0], digest[ 1], digest[ 2], digest[ 3],
-           digest[ 4], digest[ 5], digest[ 6], digest[ 7],
-           digest[ 8], digest[ 9], digest[10], digest[11],
-           digest[12], digest[13], digest[14], digest[15]);*/
+    for (int i=0; i<0x10; i++)
+        X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+    MD5_do_block(&state, block);
+    if (0x38 <= block_len)
+    {
+        memset(buf, '\0', 0x38);
+        for (int i=0; i<8; i++)
+            buf[0x38+i] = total_len >> i*8;
+        for (int i=0; i<0x10; i++)
+            X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+        MD5_do_block(&state, block);
+    }
+    return state;
 }
 
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String (const char *string, char *output)
-{
-    unsigned char digest[16];
-
-    MD5_String2binary (string, digest);
-    sprintf (output,
-             "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
-             digest[0], digest[1], digest[2], digest[3],
-             digest[4], digest[5], digest[6], digest[7],
-             digest[8], digest[9], digest[10], digest[11],
-             digest[12], digest[13], digest[14], digest[15]);
-}
 
 // Hash a password with a salt.
-char *MD5_saltcrypt(const char *key, const char *salt)
+// Whoever wrote this FAILS programming
+const char *MD5_saltcrypt(const char *key, const char *salt)
 {
-	char buf[66], *sbuf = buf+32;
-	static char obuf[33];
+    char buf[65];
 
-	// hash the key then the salt
-	// buf ends up as a 64char null terminated string
-	MD5_String(key, buf);
-	MD5_String(salt, sbuf);
+    // hash the key then the salt
+    // buf ends up as a 64-char NUL-terminated string
+    MD5_to_str(MD5_from_cstring(key), buf);
+    MD5_to_str(MD5_from_cstring(salt), buf+32);
 
-	// Hash the buffer back into sbuf
-	MD5_String(buf, sbuf);
+    // Hash the buffer back into sbuf - this is stupid
+    // (luckily, putting the result into itself is safe)
+    MD5_to_str(MD5_from_cstring(buf), buf+32);
 
-	snprintf(obuf, 32, "!%s$%s", salt, sbuf);
-	return(obuf);
+    static char obuf[33];
+    // This truncates the string, but we have to keep it like that for compatibility
+    snprintf(obuf, 32, "!%s$%s", salt, buf+32);
+    return obuf;
 }
 
-char *make_salt() {
-	static char salt[6];
-	int i;
-	for (i=0; i<5; i++)
-		salt[i] = (char)((mt_rand() % 78) + 48);
-	salt[5] = '\0';
-	return(salt);
+const char *make_salt() {
+    static char salt[6];
+    for (int i=0; i<5; i++)
+        salt[i] = MPRAND(48, 78);
+    return salt;
 }
 
-int pass_ok(const char *password, const char *crypted) {
-	char buf[40], *salt=buf+1;
+bool pass_ok(const char *password, const char *crypted) {
+    char buf[40];
+    strncpy(buf, crypted, 40);
+    char *salt = buf + 1;
+    *strchr(salt, '$') = '\0';
 
-	strncpy(buf, crypted, 40);
-	*strchr(buf, '$') = '\0';
-
-	if (!strcmp(crypted, MD5_saltcrypt(password, salt)))
-		return(1);
-
-	return(0);
+    return !strcmp(crypted, MD5_saltcrypt(password, salt));
 }
 
 // [M|h]ashes up an IP address and a secret key
@@ -337,13 +312,13 @@ int pass_ok(const char *password, const char *crypted) {
 in_addr_t MD5_ip(char *secret, in_addr_t ip)
 {
     char ipbuf[32];
-    char obuf[16];
+    uint8_t obuf[16];
     union {
         struct bytes {
-            unsigned char b1;
-            unsigned char b2;
-            unsigned char b3;
-            unsigned char b4;
+            uint8_t b1;
+            uint8_t b2;
+            uint8_t b3;
+            uint8_t b4;
         } bytes;
         in_addr_t ip;
     } conv;
@@ -351,7 +326,8 @@ in_addr_t MD5_ip(char *secret, in_addr_t ip)
     // MD5sum a secret + the IP address
     memset(&ipbuf, 0, sizeof(ipbuf));
     snprintf(ipbuf, sizeof(ipbuf), "%lu%s", (unsigned long)ip, secret);
-    MD5_String2binary(ipbuf, obuf);
+    /// TODO stop it from being a cstring
+    MD5_to_bin(MD5_from_cstring(ipbuf), obuf);
 
     // Fold the md5sum to 32 bits, pack the bytes to an in_addr_t
     conv.bytes.b1 = obuf[0] ^ obuf[1] ^ obuf[8] ^ obuf[9];
@@ -361,4 +337,3 @@ in_addr_t MD5_ip(char *secret, in_addr_t ip)
 
     return conv.ip;
 }
-
diff --git a/src/common/md5calc.h b/src/common/md5calc.h
index 5994376..cf1425f 100644
--- a/src/common/md5calc.h
+++ b/src/common/md5calc.h
@@ -1,13 +1,64 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
+#ifndef MD5CALC_H
+#define MD5CALC_H
+
+#include "sanity.h"
+
 #include <netinet/in.h>
 
-void MD5_String (const char *string, char *output);
-void MD5_String2binary (const char *string, char *output);
-char *MD5_saltcrypt(const char *key, const char *salt);
-char *make_salt();
-int pass_ok(const char *password, const char *crypted);
+#include <stdint.h> // uint32_t, uint8_t
+#include <stddef.h> // size_t
+#include <stdio.h> // FILE*
+
+/// The digest state - becomes the output
+typedef struct
+{
+    // classically named {A,B,C,D}
+    // but use an so we can index
+    uint32_t val[4];
+} MD5_state;
+typedef struct
+{
+    uint32_t data[16];
+} MD5_block;
+
+// Implementation
+void MD5_init(MD5_state* state);
+void MD5_do_block(MD5_state* state, MD5_block block);
+
+// Output formatting
+void MD5_to_bin(MD5_state state, uint8_t out[0x10]);
+void MD5_to_str(MD5_state state, char out[0x21]);
+
+// Convenience
+MD5_state MD5_from_string(const char* msg, const size_t msglen);
+MD5_state MD5_from_cstring(const char* msg);
+MD5_state MD5_from_FILE(FILE* in);
+
+
+/// Output in ASCII - with lowercase hex digits, null-terminated
+// these may overlap safely
+static void MD5_String (const char *string, char output[33]) __attribute__((deprecated));
+static inline void MD5_String (const char *string, char output[33]) {
+    MD5_to_str(MD5_from_cstring(string), output);
+}
+/// Output in binary
+static void MD5_String2binary (const char *string, uint8_t output[16]) __attribute__((deprecated));
+static inline void MD5_String2binary (const char *string, uint8_t output[16]) {
+    MD5_to_bin(MD5_from_cstring(string), output);
+}
+
+// statically-allocated output
+// whoever wrote this fails basic understanding of
+const char *MD5_saltcrypt(const char *key, const char *salt);
+
+/// return some random characters (statically allocated)
+// Currently, returns a 5-char string
+const char *make_salt();
+
+/// check plaintext password against saved saltcrypt
+bool pass_ok(const char *password, const char *crypted);
+
+/// This returns an in_addr_t because it is configurable whether it gets called at all
 in_addr_t MD5_ip(char *secret, in_addr_t ip);
 
 #endif
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 279bf4a..906f5c1 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -1,69 +1,67 @@
-// $Id: mmo.h,v 1.3 2004/09/25 20:12:25 PoW Exp $
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
+/// Global structures and defines
+#ifndef MMO_H
+#define MMO_H
 
-#ifndef	_MMO_H_
-#define	_MMO_H_
+# include <time.h>
+# include "utils.h"              // LCCWIN32
 
-#include <time.h>
-#include "utils.h"              // LCCWIN32
+# ifdef CYGWIN
+#  define RETCODE "\r\n"
+# else
+#  define RETCODE "\n"
+# endif
 
-#ifdef CYGWIN
-#define RETCODE	"\r\n"          // (CR/LF:Windows系)
-#else
-#define RETCODE "\n"            // (LF:Unix系)
-#endif
-
-#define FIFOSIZE_SERVERLINK	256*1024
+# define FIFOSIZE_SERVERLINK    256*1024
 
 // set to 0 to not check IP of player between each server.
 // set to another value if you want to check (1)
-#define CMP_AUTHFIFO_IP 1
-
-#define CMP_AUTHFIFO_LOGIN2 1
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000     // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 450
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 120            // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
-#define MAX_GUILDPOSITION 20    // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL	8
-#define MAX_GUILDCASTLE 24      // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE battle_config.min_hair_style
-#define MAX_HAIR_STYLE battle_config.max_hair_style
-#define MIN_HAIR_COLOR battle_config.min_hair_color
-#define MAX_HAIR_COLOR battle_config.max_hair_color
-#define MIN_CLOTH_COLOR battle_config.min_cloth_color
-#define MAX_CLOTH_COLOR battle_config.max_cloth_color
+# define CMP_AUTHFIFO_IP 1
+
+# define CMP_AUTHFIFO_LOGIN2 1
+
+# define MAX_MAP_PER_SERVER 512
+# define MAX_INVENTORY 100
+# define MAX_AMOUNT 30000
+# define MAX_ZENY 1000000000     // 1G zeny
+# define MAX_CART 100
+# define MAX_SKILL 450
+# define GLOBAL_REG_NUM 96
+# define ACCOUNT_REG_NUM 16
+# define ACCOUNT_REG2_NUM 16
+# define DEFAULT_WALK_SPEED 150
+# define MIN_WALK_SPEED 0
+# define MAX_WALK_SPEED 1000
+# define MAX_STORAGE 300
+# define MAX_GUILD_STORAGE 1000
+# define MAX_PARTY 12
+# define MAX_GUILD 120            // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
+# define MAX_GUILDPOSITION 20    // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
+# define MAX_GUILDEXPLUSION 32
+# define MAX_GUILDALLIANCE 16
+# define MAX_GUILDSKILL	8
+# define MAX_GUILDCASTLE 24      // increased to include novice castles [Valaris]
+# define MAX_GUILDLEVEL 50
+
+# define MIN_HAIR_STYLE battle_config.min_hair_style
+# define MAX_HAIR_STYLE battle_config.max_hair_style
+# define MIN_HAIR_COLOR battle_config.min_hair_color
+# define MAX_HAIR_COLOR battle_config.max_hair_color
+# define MIN_CLOTH_COLOR battle_config.min_cloth_color
+# define MAX_CLOTH_COLOR battle_config.max_cloth_color
 
 // for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
+# define MIN_ATTRIBUTE 0
+# define MAX_ATTRIBUTE 4
+# define ATTRIBUTE_NORMAL 0
+# define MIN_STAR 0
+# define MAX_STAR 3
 
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
+# define MIN_PORTAL_MEMO 0
+# define MAX_PORTAL_MEMO 2
 
-#define MAX_STATUS_TYPE 5
+# define MAX_STATUS_TYPE 5
 
-#define CHAR_CONF_NAME  "conf/char_athena.conf"
+# define CHAR_CONF_NAME  "conf/char_athena.conf"
 
 struct item
 {
@@ -288,19 +286,4 @@ enum
 
 };
 
-#ifndef LCCWIN32
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-#endif
-
-#endif // _MMO_H_
+#endif // MMO_H
diff --git a/src/common/mt_rand.c b/src/common/mt_rand.c
index 627d9dd..e4e8d12 100644
--- a/src/common/mt_rand.c
+++ b/src/common/mt_rand.c
@@ -48,71 +48,69 @@
 #include <time.h>
 #include "mt_rand.h"
 
-#define N              (624)    /* length of state vector */
-#define M              (397)    /* a period parameter */
-#define K              (0x9908B0DFU)    /* a magic constant */
-#define hiBit(u)       ((u) & 0x80000000U)  /* mask all but highest bit of u */
-#define loBit(u)       ((u) & 0x00000001U)  /* mask all but lowest bit of u */
-#define loBits(u)      ((u) & 0x7FFFFFFFU)  /* mask the highest bit of u */
-#define mixBits(u, v)  (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */
+#define N              624                  // length of state vector
+#define M              397                  // a period parameter
+#define K              0x9908B0DFU          // a magic constant
 
-static unsigned long state[N + 1];  /* state vector + 1 extra to not violate ANSI C */
-static unsigned long *next;     /* next random value is computed from here */
-static int left = -1;           /* can *next++ this many times before reloading */
+#define hiBit(u)       ((u) & 0x80000000U)  // mask all but highest bit of u
+#define loBit(u)       ((u) & 0x00000001U)  // mask all but lowest bit of u
+#define loBits(u)      ((u) & 0x7FFFFFFFU)  // mask the highest bit of u
+#define mixBits(u, v)  (hiBit(u)|loBits(v)) // move hi bit of u to hi bit of v
 
-void mt_seed (unsigned long seed)
+static uint32_t state[N+1]; // state vector the +1 is needed due to the coding
+static uint32_t *next;      // next random value is computed from here
+static int left = -1;       // can *next++ this many times before reloading
+
+void mt_seed (uint32_t seed)
 {
-    register unsigned long x = (seed | 1U) & 0xFFFFFFFFU, *s = state;
-    register int j;
+    uint32_t x = seed | 1U;
+    uint32_t *s = state;
+    left = 0;
 
-    for (left = 0, *s++ = x, j = N; --j; *s++ = (x *= 69069U) & 0xFFFFFFFFU);
+    for (int j = N; *s++ = x, --j; x *= 69069U);
 }
 
-unsigned long mt_reload (void)
+void mt_reload (void)
 {
-    register unsigned long *p0 = state, *p2 = state + 2, *pM =
-        state + M, s0, s1;
-    register int j;
-
+    // if mt_seed has never been called
     if (left < -1)
         mt_seed (time (NULL));
 
-    left = N - 1, next = state + 1;
+    // conceptually, these are indices into the state that wrap
+    uint32_t *p0 = state;
+    uint32_t *p2 = state + 2;
+    uint32_t *pM = state + M;
+
+    uint32_t s0 = state[0];
+    uint32_t s1 = state[1];
 
-    for (s0 = state[0], s1 = state[1], j = N - M + 1; --j;
-         s0 = s1, s1 = *p2++)
+    // regenerate the lower N-M elements of the state
+    for (int j = N-M+1; --j != 0; s0 = s1, s1 = *p2++)
         *p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
 
-    for (pM = state, j = M; --j; s0 = s1, s1 = *p2++)
+    pM = state;
+    // regenerate the next M-1 elements of the state
+    // note that s1 is set to state[N] at the end, but discarded
+    for (int j = M; --j != 0; s0 = s1, s1 = *p2++)
         *p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
 
-    s1 = state[0], *p0 =
-        *pM ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
-    s1 ^= (s1 >> 11);
-    s1 ^= (s1 << 7) & 0x9D2C5680U;
-    s1 ^= (s1 << 15) & 0xEFC60000U;
-    return (s1 ^ (s1 >> 18));
+    // regenerate the last 1 element of the state
+    s1 = state[0];
+    *p0 = *pM ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
+
+    // ready for the normal mt_random algorithm
+    left = N;
+    next = state;
 }
 
-unsigned long mt_random (void)
+uint32_t mt_random (void)
 {
-    unsigned long y;
-
     if (--left < 0)
-        return (mt_reload ());
+        mt_reload ();
 
-    y = *next++;
+    uint32_t y = *next++;
     y ^= (y >> 11);
     y ^= (y << 7) & 0x9D2C5680U;
     y ^= (y << 15) & 0xEFC60000U;
-    return (y ^ (y >> 18));
-}
-
-int mt_rand (void)
-{
-    unsigned long r = mt_random ();
-    while (r >> 16)
-        r = (r & 0xFFFF) + (r >> 16);
-
-    return (r);
+    return y ^ (y >> 18);
 }
diff --git a/src/common/mt_rand.h b/src/common/mt_rand.h
index d798fee..95f30e5 100644
--- a/src/common/mt_rand.h
+++ b/src/common/mt_rand.h
@@ -1,9 +1,21 @@
-#ifndef __mt_rand_h
-#define __mt_rand_h
+#ifndef MT_RAND_H
+#define MT_RAND_H
 
-void mt_seed (unsigned long seed);
-unsigned long mt_reload (void);
-unsigned long mt_random (void);
-int  mt_rand (void);
+# include "sanity.h"
 
-#endif /* __mt_rand_h */
+/// Initialize the generator (called automatically with time() if you don't)
+void mt_seed (uint32_t seed);
+/// Get a random number
+uint32_t mt_random (void);
+
+/**
+ * ModuloRand and ModuloPlusRand
+ * These macros are used to replace the vast number of calls to rand()%mod
+ * TODO eliminate the rest of the calls to rand()
+ * MRAND(10)    returns 0..9
+ * MPRAND(5,10) returns 5..14
+ */
+# define MRAND(mod) (mt_random() % (mod))
+# define MPRAND(add, mod) ((add) + MRAND(mod))
+
+#endif // MT_RAND_H
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
index 3205293..de10517 100644
--- a/src/common/nullpo.c
+++ b/src/common/nullpo.c
@@ -2,21 +2,17 @@
 #include <stdarg.h>
 #include <string.h>
 #include "nullpo.h"
-// #include "logs.h" // 布石してみる
 
 static void nullpo_info_core (const char *file, int line, const char *func,
                               const char *fmt, va_list ap);
 
-/*======================================
- * Nullチェック 及び 情報出力
- *--------------------------------------
- */
-int nullpo_chk_f (const char *file, int line, const char *func,
-                  const void *target, const char *fmt, ...)
+/// Null check and print format
+bool nullpo_chk_f (const char *file, int line, const char *func,
+                   const void *target, const char *fmt, ...)
 {
     va_list ap;
 
-    if (target != NULL)
+    if (target)
         return 0;
 
     va_start (ap, fmt);
@@ -24,21 +20,17 @@ int nullpo_chk_f (const char *file, int line, const char *func,
     va_end (ap);
     return 1;
 }
-
-int nullpo_chk (const char *file, int line, const char *func,
-                const void *target)
+bool nullpo_chk (const char *file, int line, const char *func,
+                 const void *target)
 {
-    if (target != NULL)
+    if (target)
         return 0;
 
     nullpo_info_core (file, line, func, NULL, NULL);
     return 1;
 }
 
-/*======================================
- * nullpo情報出力(外部呼出し向けラッパ)
- *--------------------------------------
- */
+/// External functions
 void nullpo_info_f (const char *file, int line, const char *func,
                     const char *fmt, ...)
 {
@@ -48,39 +40,25 @@ void nullpo_info_f (const char *file, int line, const char *func,
     nullpo_info_core (file, line, func, fmt, ap);
     va_end (ap);
 }
-
 void nullpo_info (const char *file, int line, const char *func)
 {
     nullpo_info_core (file, line, func, NULL, NULL);
 }
 
-/*======================================
- * nullpo情報出力(Main)
- *--------------------------------------
- */
+/// Actual output function
 static void nullpo_info_core (const char *file, int line, const char *func,
                               const char *fmt, va_list ap)
 {
-    if (file == NULL)
+    if (!file)
         file = "??";
+    if (!func || !*func)
+        func = "unknown";
 
-    func = func == NULL ? "unknown" : func[0] == '\0' ? "unknown" : func;
-
-    printf ("--- nullpo info --------------------------------------------\n");
-    printf ("%s:%d: in func `%s'\n", file, line, func);
-    if (fmt != NULL)
+    fprintf (stderr, "%s:%d: in func `%s': NULL pointer\n", file, line, func);
+    if (fmt && *fmt)
     {
-        if (fmt[0] != '\0')
-        {
-            vprintf (fmt, ap);
-
-            // 最後に改行したか確認
-            if (fmt[strlen (fmt) - 1] != '\n')
-                printf ("\n");
-        }
+        vfprintf (stderr, fmt, ap);
+        if (fmt[strlen (fmt) - 1] != '\n')
+            fputc('\n', stderr);
     }
-    printf ("--- end nullpo info ----------------------------------------\n");
-
-    // ここらでnullpoログをファイルに書き出せたら
-    // まとめて提出できるなと思っていたり。
 }
diff --git a/src/common/nullpo.h b/src/common/nullpo.h
index baeacdc..9b33b4b 100644
--- a/src/common/nullpo.h
+++ b/src/common/nullpo.h
@@ -1,215 +1,61 @@
-#ifndef _NULLPO_H_
-#define _NULLPO_H_
-
-#define NULLPO_CHECK 1
-        // 全体のスイッチを宣言しているヘッダがあれば
-        // そこに移動していただけると
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-#  define __func__ __FUNCTION__
-# else
-#  define __func__ ""
-# endif
-#endif
-
-#ifdef LCCWIN32
-#define __attribute__(x)        /* nothing */
-#endif
-
-#define NLP_MARK __FILE__, __LINE__, __func__
-
-/*----------------------------------------------------------------------------
- * Macros
- *----------------------------------------------------------------------------
- */
-/*======================================
- * Nullチェック 及び 情報出力後 return
- *・展開するとifとかreturn等が出るので
- *  一行単体で使ってください。
- *・nullpo_ret(x = func());
- *  のような使用法も想定しています。
- *--------------------------------------
- * nullpo_ret(t)
- *   戻り値 0固定
- * [引数]
- *  t       チェック対象
- *--------------------------------------
- * nullpo_retv(t)
- *   戻り値 なし
- * [引数]
- *  t       チェック対象
- *--------------------------------------
- * nullpo_retr(ret, t)
- *   戻り値 指定
- * [引数]
- *  ret     return(ret);
- *  t       チェック対象
- *--------------------------------------
- * nullpo_ret_f(t, fmt, ...)
- *   詳細情報出力用
- *   戻り値 0
- * [引数]
- *  t       チェック対象
- *  fmt ... vprintfに渡される
- *    備考や関係変数の書き出しなどに
- *--------------------------------------
- * nullpo_retv_f(t, fmt, ...)
- *   詳細情報出力用
- *   戻り値 なし
- * [引数]
- *  t       チェック対象
- *  fmt ... vprintfに渡される
- *    備考や関係変数の書き出しなどに
- *--------------------------------------
- * nullpo_retr_f(ret, t, fmt, ...)
- *   詳細情報出力用
- *   戻り値 指定
- * [引数]
- *  ret     return(ret);
- *  t       チェック対象
- *  fmt ... vprintfに渡される
- *    備考や関係変数の書き出しなどに
- *--------------------------------------
- */
-
-#if NULLPO_CHECK
-
-#define nullpo_ret(t) \
-	if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
-
-#define nullpo_retv(t) \
-	if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
-
-#define nullpo_retr(ret, t) \
-	if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
-
-// 可変引数マクロに関する条件コンパイル
-#if __STDC_VERSION__ >= 199901L
-/* C99に対応 */
-#define nullpo_ret_f(t, fmt, ...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, ...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, ...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
-
-#elif __GNUC__ >= 2
-/* GCC用 */
-#define nullpo_ret_f(t, fmt, args...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, args...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, args...) \
-	if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
-
-#else
-
-/* その他の場合・・・ orz */
-
-#endif
-
-#else /* NULLPO_CHECK */
-/* No Nullpo check */
-
-// if((t)){;}
-// 良い方法が思いつかなかったので・・・苦肉の策です。
-// 一応ワーニングは出ないはず
-
-#define nullpo_ret(t) if((t)){;}
-#define nullpo_retv(t) if((t)){;}
-#define nullpo_retr(ret, t) if((t)){;}
-
-// 可変引数マクロに関する条件コンパイル
-#if __STDC_VERSION__ >= 199901L
-/* C99に対応 */
-#define nullpo_ret_f(t, fmt, ...) if((t)){;}
-#define nullpo_retv_f(t, fmt, ...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
-
-#elif __GNUC__ >= 2
-/* GCC用 */
-#define nullpo_ret_f(t, fmt, args...) if((t)){;}
-#define nullpo_retv_f(t, fmt, args...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
-
-#else
-/* その他の場合・・・ orz */
-#endif
-
-#endif /* NULLPO_CHECK */
-
-/*----------------------------------------------------------------------------
- * Functions
- *----------------------------------------------------------------------------
- */
-/*======================================
- * nullpo_chk
- *   Nullチェック 及び 情報出力
- * [引数]
- *  file    __FILE__
- *  line    __LINE__
- *  func    __func__ (関数名)
- *    これらには NLP_MARK を使うとよい
- *  target  チェック対象
- * [返り値]
- *  0 OK
- *  1 NULL
- *--------------------------------------
- */
-int  nullpo_chk (const char *file, int line, const char *func,
+/// return wrappers for unexpected NULL pointers
+#ifndef NULLPO_H
+#define NULLPO_H
+/// Comment this out to live dangerously
+# define NULLPO_CHECK
+
+/// All functions print to standard error (was: standard output)
+/// nullpo_ret(cond) - return 0 if given pointer is NULL
+/// nullpo_retv(cond) - just return (function returns void)
+/// nullpo_retr(rv, cond) - return given value instead
+/// the _f variants take a printf-format string and arguments
+
+# ifdef NULLPO_CHECK
+# define NLP_MARK __FILE__, __LINE__, __func__
+#  define nullpo_ret(t) \
+    if (nullpo_chk(NLP_MARK, t)) \
+        return 0;
+#  define nullpo_retv(t) \
+    if (nullpo_chk(NLP_MARK, t)) \
+        return;
+#  define nullpo_retr(ret, t) \
+    if (nullpo_chk(NLP_MARK, t)) \
+        return ret;
+#  define nullpo_ret_f(t, fmt, ...) \
+    if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+        return 0;
+#  define nullpo_retv_f(t, fmt, ...) \
+    if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+        return;
+#  define nullpo_retr_f(ret, t, fmt, ...) \
+    if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+        return ret;
+# else // NULLPO_CHECK
+#  define nullpo_ret(t) t;
+#  define nullpo_retv(t) t;
+#  define nullpo_retr(ret, t) t;
+#  define nullpo_ret_f(t, fmt, ...) t;
+#  define nullpo_retv_f(t, fmt, ...) t;
+#  define nullpo_retr_f(ret, t, fmt, ...) t;
+# endif // NULLPO_CHECK
+
+# include "sanity.h"
+
+/// Used by macros in this header
+bool nullpo_chk (const char *file, int line, const char *func,
                  const void *target);
 
-/*======================================
- * nullpo_chk_f
- *   Nullチェック 及び 詳細な情報出力
- * [引数]
- *  file    __FILE__
- *  line    __LINE__
- *  func    __func__ (関数名)
- *    これらには NLP_MARK を使うとよい
- *  target  チェック対象
- *  fmt ... vprintfに渡される
- *    備考や関係変数の書き出しなどに
- * [返り値]
- *  0 OK
- *  1 NULL
- *--------------------------------------
- */
-int  nullpo_chk_f (const char *file, int line, const char *func,
+/// Used by macros in this header
+bool nullpo_chk_f (const char *file, int line, const char *func,
                    const void *target, const char *fmt, ...)
     __attribute__ ((format (printf, 5, 6)));
 
-/*======================================
- * nullpo_info
- *   nullpo情報出力
- * [引数]
- *  file    __FILE__
- *  line    __LINE__
- *  func    __func__ (関数名)
- *    これらには NLP_MARK を使うとよい
- *--------------------------------------
- */
+/// Used only by map/battle.c
 void nullpo_info (const char *file, int line, const char *func);
 
-/*======================================
- * nullpo_info_f
- *   nullpo詳細情報出力
- * [引数]
- *  file    __FILE__
- *  line    __LINE__
- *  func    __func__ (関数名)
- *    これらには NLP_MARK を使うとよい
- *  fmt ... vprintfに渡される
- *    備考や関係変数の書き出しなどに
- *--------------------------------------
- */
+/// Not used
 void nullpo_info_f (const char *file, int line, const char *func,
                     const char *fmt, ...)
     __attribute__ ((format (printf, 4, 5)));
 
-#endif
+#endif // NULLPO_H
diff --git a/src/common/sanity.h b/src/common/sanity.h
new file mode 100644
index 0000000..168671f
--- /dev/null
+++ b/src/common/sanity.h
@@ -0,0 +1,36 @@
+/// return wrappers for unexpected NULL pointers
+#ifndef SANITY_H
+#define SANITY_H
+# if __STDC_VERSION__ < 199901L
+#  error "Please compile in C99 mode"
+# endif
+# if __GNUC__ < 3
+// I don't specifically know what version this requires,
+// but GCC 3 was the beginning of modern GCC
+#  error "Please upgrade your compiler to at least GCC 3"
+# endif
+# ifndef __i386__
+// Known platform dependencies:
+// endianness for the [RW]FIFO.* macros
+// possibly, some signal-handling
+#  error "Unsupported platform"
+# endif
+# ifdef __x86_64__
+// I'm working on it - I know there are some pointer-size assumptions.
+#  error "Sorry, this code is believed not to be 64-bit safe"
+#  error "please compile with -m32"
+# endif
+
+/// A name for unused function arguments - can be repeated
+# define UNUSED UNUSED_IMPL(__COUNTER__)
+// Don't you just love the hoops the preprocessor makes you go through?
+#  define UNUSED_IMPL(arg) UNUSED_IMPL2(arg)
+#  define UNUSED_IMPL2(suffix) unused_ ## suffix __attribute__((unused))
+/// Convert conditions to use the bool type
+# include <stdbool.h>
+/// Convert type assumptions to use the standard types here
+# include <stdint.h>
+/// size_t, NULL
+# include <stddef.h>
+
+#endif // SANITY_H
diff --git a/src/common/socket.c b/src/common/socket.c
index dbf19c1..7c86b1a 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -6,17 +6,11 @@
 #include <sys/types.h>
 #include <errno.h>
 
-#ifdef LCCWIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#else
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <sys/time.h>
 #include <unistd.h>
-#endif
 
 #include <fcntl.h>
 #include <string.h>
@@ -25,191 +19,115 @@
 #include "socket.h"
 #include "utils.h"
 
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
 fd_set readfds;
 int  fd_max;
 int  currentuse;
 
-int  rfifo_size = 65536;
-int  wfifo_size = 65536;
+const uint32_t rfifo_size = 65536;
+const uint32_t wfifo_size = 65536;
 
 struct socket_data *session[FD_SETSIZE];
 
-static int null_parse (int fd);
-static int (*default_func_parse) (int) = null_parse;
+/// Discard all input
+static void null_parse (int fd);
+/// Default parser for new connections
+static void (*default_func_parse) (int) = null_parse;
 
-/*======================================
- *	CORE : Set function
- *--------------------------------------
- */
-void set_defaultparse (int (*defaultparse) (int))
+void set_defaultparse (void (*defaultparse) (int))
 {
     default_func_parse = defaultparse;
 }
 
-/*======================================
- *	CORE : Socket Sub Function
- *--------------------------------------
- */
-
-static int recv_to_fifo (int fd)
+/// Read from socket to the queue
+static void recv_to_fifo (int fd)
 {
-    int  len;
-
-    //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof);
     if (session[fd]->eof)
-        return -1;
-
-#ifdef LCCWIN32
-    len =
-        recv (fd, session[fd]->rdata + session[fd]->rdata_size,
-              RFIFOSPACE (fd), 0);
-#else
-    len =
-        read (fd, session[fd]->rdata + session[fd]->rdata_size,
-              RFIFOSPACE (fd));
-#endif
+        return;
 
-//  printf (":::RECEIVE:::\n");
-//  dump(session[fd]->rdata, len); printf ("\n");
+    ssize_t len = read (fd, session[fd]->rdata + session[fd]->rdata_size,
+                        RFIFOSPACE (fd));
 
-    //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");}
     if (len > 0)
     {
         session[fd]->rdata_size += len;
-        if (!session[fd]->connected)
-            session[fd]->connected = 1;
+        session[fd]->connected = 1;
     }
-    else if (len <= 0)
+    else
     {
-        // value of connection is not necessary the same
-//      if (fd == 4)            // Removed [Yor]
-//          printf("Char-Server Has Disconnected.\n");
-//      else if (fd == 5)       // Removed [Yor]
-//          printf("Attempt To Log In Successful.\n");
-//      else if (fd == 7)       // Removed [Yor]
-//          printf("Char-Server Has Disconnected.\n");
-//      else if (fd == 8)       // Removed [Valaris]
-//          printf("%s has logged off your server.\n",RFIFOP(fd,6));    // Removed [Valaris]
-
-//      else if (fd != 8)   // [Valaris]
-        printf ("set eof : connection #%d\n", fd);
         session[fd]->eof = 1;
     }
-    return 0;
 }
 
-static int send_from_fifo (int fd)
+static void send_from_fifo (int fd)
 {
-    int  len;
-
-    //printf("send_from_fifo : %d\n",fd);
     if (session[fd]->eof)
-        return -1;
-
-#ifdef LCCWIN32
-    len = send (fd, session[fd]->wdata, session[fd]->wdata_size, 0);
-#else
-    len = write (fd, session[fd]->wdata, session[fd]->wdata_size);
-#endif
+        return;
 
-//  printf (":::SEND:::\n");
-//  dump(session[fd]->wdata, len); printf ("\n");
+    ssize_t len = write (fd, session[fd]->wdata, session[fd]->wdata_size);
 
-    //{ int i; printf("send %d : ",fd);  for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");}
     if (len > 0)
     {
-        if (len < session[fd]->wdata_size)
+        session[fd]->wdata_size -= len;
+        if (len < (ssize_t)session[fd]->wdata_size)
         {
             memmove (session[fd]->wdata, session[fd]->wdata + len,
-                     session[fd]->wdata_size - len);
-            session[fd]->wdata_size -= len;
+                     session[fd]->wdata_size);
         }
-        else
-        {
-            session[fd]->wdata_size = 0;
-        }
-        if (!session[fd]->connected)
-            session[fd]->connected = 1;
+        session[fd]->connected = 1;
     }
     else
     {
-        printf ("set eof :%d\n", fd);
         session[fd]->eof = 1;
     }
-    return 0;
 }
 
-static int null_parse (int fd)
+static void null_parse (int fd)
 {
     printf ("null_parse : %d\n", fd);
     RFIFOSKIP (fd, RFIFOREST (fd));
-    return 0;
 }
 
-/*======================================
- *	CORE : Socket Function
- *--------------------------------------
- */
 
-static int connect_client (int listen_fd)
+static void connect_client (int listen_fd)
 {
-    int  fd;
     struct sockaddr_in client_address;
-    unsigned int len;
-    int  result;
-    int  yes = 1;               // reuse fix
-
-    //printf("connect_client : %d\n",listen_fd);
-
-    printf ("used: %d, max FDs: %d, SOFT: %d\n", currentuse, FD_SETSIZE,
-            SOFT_LIMIT);
-
-    len = sizeof (client_address);
+    socklen_t len = sizeof (client_address);
 
-    fd = accept (listen_fd, (struct sockaddr *) &client_address, &len);
-    if (fd_max <= fd)
+    int fd = accept (listen_fd, (struct sockaddr *) &client_address, &len);
+    if (fd == -1)
     {
-        fd_max = fd + 1;
+        perror ("accept");
+        return;
     }
-    else if (fd == -1)
+    if (fd_max <= fd)
     {
-        perror ("accept");
-        return -1;
+        fd_max = fd + 1;
     }
     if (!free_fds ())
-    {                           // gracefully end the connecting if no free FD
-        printf ("softlimit reached, disconnecting : %d\n", fd);
+    {
+        fprintf (stderr, "softlimit reached, disconnecting : %d\n", fd);
         delete_session (fd);
-        return -1;
+        return;
     }
 
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes);   // reuse fix
-#ifdef SO_REUSEPORT
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes);   //reuse fix
-#endif
-//  setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
-    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes);   // reuse fix
+    const int yes = 1;
+    /// Allow to bind() again after the server restarts.
+    // Since the socket is still in the TIME_WAIT, there's a possibility
+    // that formerly lost packets might be delivered and confuse the server.
+    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+    /// Send packets as soon as possible
+    /// even if the kernel thinks there is too little for it to be worth it!
+    // I'm not convinced this is a good idea; although in minimizes the
+    // latency for an individual write, it increases traffic in general.
+    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
 
     FD_SET (fd, &readfds);
 
-#ifdef LCCWIN32
-    {
-        unsigned long val = 1;
-        ioctlsocket (fd, FIONBIO, &val);
-    }
-#else
-    result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
+    fcntl (fd, F_SETFL, O_NONBLOCK);
 
     CREATE (session[fd], struct socket_data, 1);
-    CREATE (session[fd]->rdata, unsigned char, rfifo_size);
-    CREATE (session[fd]->wdata, unsigned char, wfifo_size);
+    CREATE (session[fd]->rdata, uint8_t, rfifo_size);
+    CREATE (session[fd]->wdata, uint8_t, wfifo_size);
 
     session[fd]->max_rdata = rfifo_size;
     session[fd]->max_wdata = wfifo_size;
@@ -221,59 +139,44 @@ static int connect_client (int listen_fd)
     session[fd]->connected = 0;
 
     currentuse++;
-
-    //printf("new_session : %d %d\n",fd,session[fd]->eof);
-    return fd;
 }
 
-int make_listen_port (int port)
+int make_listen_port (uint16_t port)
 {
     struct sockaddr_in server_address;
-    int  fd;
-    int  result;
-    int  yes = 1;               // reuse fix
-
-    fd = socket (AF_INET, SOCK_STREAM, 0);
-    if (fd_max <= fd)
-        fd_max = fd + 1;
-    else if (fd == -1)
+    int  fd = socket (AF_INET, SOCK_STREAM, 0);
+    if (fd == -1)
     {
-        perror ("connect");
+        perror ("socket");
         return -1;
     }
+    if (fd_max <= fd)
+        fd_max = fd + 1;
 
-#ifdef LCCWIN32
-    {
-        unsigned long val = 1;
-        ioctlsocket (fd, FIONBIO, &val);
-    }
-#else
-    result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
-
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes);   // reuse fix
-#ifdef SO_REUSEPORT
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes);   //reuse fix
-#endif
-//  setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
-    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes);   // reuse fix
+    fcntl (fd, F_SETFL, O_NONBLOCK);
+
+    const int yes = 1;
+    /// Allow to bind() again after the server restarts.
+    // Since the socket is still in the TIME_WAIT, there's a possibility
+    // that formerly lost packets might be delivered and confuse the server.
+    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+    /// Send packets as soon as possible
+    /// even if the kernel thinks there is too little for it to be worth it!
+    // I'm not convinced this is a good idea; although in minimizes the
+    // latency for an individual write, it increases traffic in general.
+    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
 
     server_address.sin_family = AF_INET;
     server_address.sin_addr.s_addr = htonl (INADDR_ANY);
     server_address.sin_port = htons (port);
 
-    result =
-        bind (fd, (struct sockaddr *) &server_address,
-              sizeof (server_address));
-    if (result == -1)
+    if (bind (fd, (struct sockaddr *) &server_address,
+              sizeof (server_address)) == -1)
     {
         perror ("bind");
         exit (1);
     }
-    result = listen (fd, 5);
-    if (result == -1)
+    if (listen (fd, 5) == -1)
     {                           /* error */
         perror ("listen");
         exit (1);
@@ -283,12 +186,6 @@ int make_listen_port (int port)
 
     CREATE (session[fd], struct socket_data, 1);
 
-    if (session[fd] == NULL)
-    {
-        printf ("out of memory : make_listen_port\n");
-        exit (1);
-    }
-    memset (session[fd], 0, sizeof (*session[fd]));
     session[fd]->func_recv = connect_client;
     session[fd]->created = time (NULL);
     session[fd]->connected = 1;
@@ -297,53 +194,45 @@ int make_listen_port (int port)
     return fd;
 }
 
-int make_connection (long ip, int port)
+int make_connection (uint32_t ip, uint16_t port)
 {
     struct sockaddr_in server_address;
-    int  fd;
-    int  result;
-    int  yes = 1;               // reuse fix
-
-    fd = socket (AF_INET, SOCK_STREAM, 0);
-    if (fd_max <= fd)
-        fd_max = fd + 1;
-    else if (fd == -1)
+    int  fd = socket (AF_INET, SOCK_STREAM, 0);
+    if (fd == -1)
     {
         perror ("socket");
         return -1;
     }
+    if (fd_max <= fd)
+        fd_max = fd + 1;
 
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes);   // reuse fix
-#ifdef SO_REUSEPORT
-//  setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
-    setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes);   //reuse fix
-#endif
-//  setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
-    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes);   // reuse fix
+    const int yes = 1;
+    /// Allow to bind() again after the server restarts.
+    // Since the socket is still in the TIME_WAIT, there's a possibility
+    // that formerly lost packets might be delivered and confuse the server.
+    setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+    /// Send packets as soon as possible
+    /// even if the kernel thinks there is too little for it to be worth it!
+    // I'm not convinced this is a good idea; although in minimizes the
+    // latency for an individual write, it increases traffic in general.
+    setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
 
     server_address.sin_family = AF_INET;
     server_address.sin_addr.s_addr = ip;
     server_address.sin_port = htons (port);
 
-#ifdef LCCWIN32
-    {
-        unsigned long val = 1;
-        ioctlsocket (fd, FIONBIO, &val);
-    }
-#else
-    result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
+    fcntl (fd, F_SETFL, O_NONBLOCK);
 
-    result =
-        connect (fd, (struct sockaddr *) (&server_address),
-                 sizeof (struct sockaddr_in));
+    /// Errors not caught - we must not block
+    /// Let the main select() loop detect when we know the state
+    connect (fd, (struct sockaddr *) &server_address,
+             sizeof (struct sockaddr_in));
 
     FD_SET (fd, &readfds);
 
     CREATE (session[fd], struct socket_data, 1);
-    CREATE (session[fd]->rdata, unsigned char, rfifo_size);
-    CREATE (session[fd]->wdata, unsigned char, wfifo_size);
+    CREATE (session[fd]->rdata, uint8_t, rfifo_size);
+    CREATE (session[fd]->wdata, uint8_t, wfifo_size);
 
     session[fd]->max_rdata = rfifo_size;
     session[fd]->max_wdata = wfifo_size;
@@ -357,51 +246,53 @@ int make_connection (long ip, int port)
     return fd;
 }
 
-int delete_session (int fd)
+void delete_session (int fd)
 {
     if (fd < 0 || fd >= FD_SETSIZE)
-        return -1;
+        return;
+    // If this was the highest fd, decrease it
+    // We could add a loop to decrement fd_max further for every null session,
+    // but this is cheap and good enough for the typical case
+    if (fd == fd_max - 1)
+        fd_max--;
     FD_CLR (fd, &readfds);
     if (session[fd])
     {
-        if (session[fd]->rdata)
-            free (session[fd]->rdata);
-        if (session[fd]->wdata)
-            free (session[fd]->wdata);
-        if (session[fd]->session_data)
-            free (session[fd]->session_data);
+        free (session[fd]->rdata);
+        free (session[fd]->wdata);
+        free (session[fd]->session_data);
         free (session[fd]);
     }
     session[fd] = NULL;
+
+    // just close() would try to keep sending buffers
     shutdown (fd, SHUT_RDWR);
     close (fd);
     currentuse--;
     if (currentuse < 0)
     {
-        printf ("delete_session: current sessions negative!\n");
+        fprintf (stderr, "delete_session: current sessions negative!\n");
         currentuse = 0;
     }
-    //printf("delete_session:%d\n",fd);
-    return 0;
+    return;
 }
 
-int realloc_fifo (int fd, int rfifo_size, int wfifo_size)
+void realloc_fifo (int fd, size_t rfifo_size, size_t wfifo_size)
 {
     struct socket_data *s = session[fd];
     if (s->max_rdata != rfifo_size && s->rdata_size < rfifo_size)
     {
-        RECREATE (s->rdata, unsigned char, rfifo_size);
+        RECREATE (s->rdata, uint8_t, rfifo_size);
         s->max_rdata = rfifo_size;
     }
     if (s->max_wdata != wfifo_size && s->wdata_size < wfifo_size)
     {
-        RECREATE (s->wdata, unsigned char, wfifo_size);
+        RECREATE (s->wdata, uint8_t, wfifo_size);
         s->max_wdata = wfifo_size;
     }
-    return 0;
 }
 
-int WFIFOSET (int fd, int len)
+void WFIFOSET (int fd, size_t len)
 {
     struct socket_data *s = session[fd];
     if (s->wdata_size + len + 16384 > s->max_wdata)
@@ -409,64 +300,49 @@ int WFIFOSET (int fd, int len)
         realloc_fifo (fd, s->max_rdata, s->max_wdata << 1);
         printf ("socket: %d wdata expanded to %d bytes.\n", fd, s->max_wdata);
     }
-    s->wdata_size = (s->wdata_size + (len) + 2048 < s->max_wdata) ?
-        s->wdata_size + len : (printf ("socket: %d wdata lost !!\n", fd),
-                               s->wdata_size);
-    return 0;
+    if (s->wdata_size + len + 2048 < s->max_wdata)
+        s->wdata_size += len;
+    else
+        fprintf (stderr, "socket: %d wdata lost !!\n", fd), abort ();
 }
 
-int do_sendrecv (int next)
+void do_sendrecv (uint32_t next)
 {
-    fd_set rfd, wfd;
-    struct timeval timeout;
-    int  ret, i;
-
-    rfd = readfds;
+    fd_set rfd = readfds, wfd;
     FD_ZERO (&wfd);
-    for (i = 0; i < fd_max; i++)
+    for (int i = 0; i < fd_max; i++)
     {
-        if (!session[i] && FD_ISSET (i, &readfds))
-        {
-            printf ("force clr fds %d\n", i);
-            FD_CLR (i, &readfds);
-            continue;
-        }
-        if (!session[i])
-            continue;
-        if (session[i]->wdata_size)
+        if (session[i] && session[i]->wdata_size)
             FD_SET (i, &wfd);
     }
+    struct timeval timeout;
     timeout.tv_sec = next / 1000;
     timeout.tv_usec = next % 1000 * 1000;
-    ret = select (fd_max, &rfd, &wfd, NULL, &timeout);
-    if (ret <= 0)
-        return 0;
-    for (i = 0; i < fd_max; i++)
+    if (select (fd_max, &rfd, &wfd, NULL, &timeout) <= 0)
+        return;
+    for (int i = 0; i < fd_max; i++)
     {
         if (!session[i])
             continue;
         if (FD_ISSET (i, &wfd))
         {
-            //printf("write:%d\n",i);
             if (session[i]->func_send)
                 //send_from_fifo(i);
                 session[i]->func_send (i);
         }
         if (FD_ISSET (i, &rfd))
         {
-            //printf("read:%d\n",i);
             if (session[i]->func_recv)
                 //recv_to_fifo(i);
+                //or connect_client(i);
                 session[i]->func_recv (i);
         }
     }
-    return 0;
 }
 
-int do_parsepacket (void)
+void do_parsepacket (void)
 {
-    int  i;
-    for (i = 0; i < fd_max; i++)
+    for (int i = 0; i < fd_max; i++)
     {
         if (!session[i])
             continue;
@@ -476,76 +352,54 @@ int do_parsepacket (void)
             printf ("Session #%d timed out\n", i);
             session[i]->eof = 1;
         }
-        if (session[i]->rdata_size == 0 && session[i]->eof == 0)
+        if (!session[i]->rdata_size && !session[i]->eof)
             continue;
         if (session[i]->func_parse)
         {
             session[i]->func_parse (i);
+            /// some func_parse may call delete_session
             if (!session[i])
                 continue;
         }
+        /// Reclaim buffer space for what was read
         RFIFOFLUSH (i);
     }
-    return 0;
 }
 
 void do_socket (void)
 {
     FD_ZERO (&readfds);
-    currentuse = 2;
+    currentuse = 3;
 }
 
-int RFIFOSKIP (int fd, int len)
+void RFIFOSKIP (int fd, size_t len)
 {
     struct socket_data *s = session[fd];
+    s->rdata_pos += len;
 
-    if (s->rdata_size - s->rdata_pos - len < 0)
+    if (s->rdata_size < s->rdata_pos)
     {
         fprintf (stderr, "too many skip\n");
-        exit (1);
+        abort ();
     }
-
-    s->rdata_pos = s->rdata_pos + len;
-
-    return 0;
 }
 
-int Net_Init (void)
+void fclose_ (FILE * fp)
 {
-#ifdef LCCWIN32
-    /* Start up the windows networking */
-    WORD version_wanted = MAKEWORD (1, 1);
-    WSADATA wsaData;
-
-    if (WSAStartup (version_wanted, &wsaData) != 0)
-    {
-        printf ("SYSERR: WinSock not available!\n");
-        exit (1);
-    }
-#endif
-
-    return (0);
-}
-
-int fclose_ (FILE * fp)
-{
-    int  res = fclose (fp);
-    if (res == 0)
-        currentuse--;
-//  printf("file closed: used: %d\n",currentuse);
-    return res;
+    if (fclose (fp))
+        perror ("fclose"), abort ();
+    currentuse--;
 }
 
 FILE *fopen_ (const char *path, const char *mode)
 {
     FILE *f = fopen (path, mode);
-    if (f != NULL)
+    if (f)
         currentuse++;
-//  printf("file opened: used: %d\n",currentuse);
     return f;
 }
 
-int free_fds ()
+bool free_fds ()
 {
-    return (currentuse + 1 < SOFT_LIMIT) ? 1 : 0;
+    return currentuse < SOFT_LIMIT;
 }
diff --git a/src/common/socket.h b/src/common/socket.h
index aa4f91f..0e15f5b 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -1,110 +1,135 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef	_SOCKET_H_
-#define _SOCKET_H_
-
-#include <stdio.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <time.h>
-
-// define declaration
-
-#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
-#define RFIFOB(fd,pos) (*(unsigned char*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOW(fd,pos) (*(unsigned short*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOL(fd,pos) (*(unsigned int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
-#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
-#define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),session[fd]->rdata_size=RFIFOREST(fd),session[fd]->rdata_pos=0)
-#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
-#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
-#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
-#define RBUFL(p,pos) (*(unsigned int*)RBUFP((p),(pos)))
-
-#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
-#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
-#define WFIFOB(fd,pos) (*(unsigned char*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOW(fd,pos) (*(unsigned short*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOL(fd,pos) (*(unsigned int*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-// use function instead of macro.
-//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size+(len)+2048 < session[fd]->max_wdata) ? session[fd]->wdata_size+len : session[fd]->wdata_size)
-#define WBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define WBUFB(p,pos) (*(unsigned char*)WBUFP((p),(pos)))
-#define WBUFW(p,pos) (*(unsigned short*)WBUFP((p),(pos)))
-#define WBUFL(p,pos) (*(unsigned int*)WBUFP((p),(pos)))
-
-#ifdef __INTERIX
-#define FD_SETSIZE 4096
-#endif // __INTERIX
-
-/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
+#ifndef SOCKET_H
+#define SOCKET_H
+
+# include "sanity.h"
+
+# include <stdio.h>
+
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+
+# include <time.h>
+
+/// Check how much can be read
+# define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
+/// Read from the queue
+# define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
+# define RFIFOB(fd,pos) (*(uint8_t*)(RFIFOP(fd, pos)))
+# define RFIFOW(fd,pos) (*(uint16_t*)(RFIFOP(fd, pos)))
+# define RFIFOL(fd,pos) (*(uint32_t*)(RFIFOP(fd, pos)))
+/// Done reading
+void RFIFOSKIP (int fd, size_t len);
+/// Internal - clean up by discarding handled bytes
+// Atm this is also called in char/char.c, but that is unnecessary
+# define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),\
+session[fd]->rdata_size=RFIFOREST(fd),\
+session[fd]->rdata_pos=0)
+
+/// Used internally - how much room there is to read more data
+# define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
+
+/// Read from an arbitrary buffer
+# define RBUFP(p,pos) (((uint8_t*)(p))+(pos))
+# define RBUFB(p,pos) (*(uint8_t*)RBUFP((p),(pos)))
+# define RBUFW(p,pos) (*(uint16_t*)RBUFP((p),(pos)))
+# define RBUFL(p,pos) (*(uint32_t*)RBUFP((p),(pos)))
+
+
+
+/// Unused - check how much data can be written
+# define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
+/// Write to the queue
+# define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
+# define WFIFOB(fd,pos) (*(uint8_t*)(WFIFOP(fd,pos)))
+# define WFIFOW(fd,pos) (*(uint16_t*)(WFIFOP(fd,pos)))
+# define WFIFOL(fd,pos) (*(uint32_t*)(WFIFOP(fd,pos)))
+/// Finish writing
+void WFIFOSET (int fd, size_t len);
+
+/// Write to an arbitrary buffer
+#define WBUFP(p,pos) (((uint8_t*)(p))+(pos))
+#define WBUFB(p,pos) (*(uint8_t*)WBUFP((p),(pos)))
+#define WBUFW(p,pos) (*(uint16_t*)WBUFP((p),(pos)))
+#define WBUFL(p,pos) (*(uint32_t*)WBUFP((p),(pos)))
 
 // Struct declaration
 
 struct socket_data
 {
-    int  eof;
+    /// Checks whether a newly-connected socket actually does anything
     time_t created;
-    int  connected;
-    unsigned char *rdata, *wdata;
-    int  max_rdata, max_wdata;
-    int  rdata_size, wdata_size;
-    int  rdata_pos;
-    struct sockaddr_in client_addr;
-    int  (*func_recv) (int);
-    int  (*func_send) (int);
-    int  (*func_parse) (int);
-    void *session_data;
-};
+    bool connected;
 
-// Data prototype declaration
+    /// Flag needed since structure must be freed in a server-dependent manner
+    bool eof;
 
-#ifdef LCCWIN32
+    /// Since this is a single-threaded application, it can't block
+    /// These are the read/write queues
+    uint8_t *rdata, *wdata;
+    size_t max_rdata, max_wdata;
+    /// How much is actually in the queue
+    size_t rdata_size, wdata_size;
+    /// How much has already been read from the queue
+    /// Note that there is no need for a wdata_pos
+    size_t rdata_pos;
 
-#undef FD_SETSIZE
-#define FD_SETSIZE 4096
+    struct sockaddr_in client_addr;
 
-#endif
+    /// Send or recieve
+    /// Only called when select() indicates the socket is ready
+    /// If, after that, nothing is read, it sets eof
+    // These could probably be hard-coded with a little work
+    void (*func_recv) (int);
+    void (*func_send) (int);
+    /// This is the important one
+    /// Set to different functions depending on whether the connection
+    /// is a player or a server/ladmin
+    /// Can be set explicitly or via set_defaultparse
+    void (*func_parse) (int);
+    /// Server-specific data type
+    void *session_data;
+};
 
 // save file descriptors for important stuff
-#define SOFT_LIMIT (FD_SETSIZE - 50)
+# define SOFT_LIMIT (FD_SETSIZE - 50)
 
 // socket timeout to establish a full connection in seconds
-#define CONNECT_TIMEOUT 15
+# define CONNECT_TIMEOUT 15
 
+/// Everyone who has connected
+// note: call delete_session(i) to null out an element
 extern struct socket_data *session[FD_SETSIZE];
 
-extern int rfifo_size, wfifo_size;
+/// Maximum used FD, +1
 extern int fd_max;
 
-// Function prototype declaration
-
-int  make_listen_port (int);
-int  make_connection (long, int);
-int  delete_session (int);
-int  realloc_fifo (int fd, int rfifo_size, int wfifo_size);
-int  WFIFOSET (int fd, int len);
-int  RFIFOSKIP (int fd, int len);
-
-int  do_sendrecv (int next);
-int  do_parsepacket (void);
+/// open a socket, bind, and listen. Return an fd, or -1 if socket() fails,
+/// but exit if bind() or listen() fails
+int  make_listen_port (uint16_t port);
+/// Connect to an address, return a connected socket or -1
+// FIXME - this is IPv4 only!
+int  make_connection (uint32_t ip, uint16_t port);
+/// free() the structure and close() the fd
+void delete_session (int);
+/// Make a the internal queues bigger
+void realloc_fifo (int fd, size_t rfifo_size, size_t wfifo_size);
+/// Update all sockets that can be read/written from the queues
+void do_sendrecv (uint32_t next);
+/// Call the parser function for every socket that has read data
+void do_parsepacket (void);
+
+/// An init function
 void do_socket (void);
 
-void set_defaultparse (int (*defaultparse) (int));
+/// Change the default parser for newly connected clients
+// typically called once per server, but individual clients may identify
+// themselves as servers
+void set_defaultparse (void (*defaultparse) (int));
 
-int  Net_Init (void);
-
-int  fclose_ (FILE * fp);
+/// Wrappers to track number of free FDs
+void fclose_ (FILE * fp);
 FILE *fopen_ (const char *path, const char *mode);
+bool free_fds ();
 
-int  free_fds ();
-
-#endif // _SOCKET_H_
+#endif // SOCKET_H
diff --git a/src/common/timer.c b/src/common/timer.c
index fca6f42..bf21c8e 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -1,184 +1,127 @@
-// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
 
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
 #include <sys/socket.h>
 #include <sys/time.h>
-#endif
 
 #include "timer.h"
 #include "utils.h"
 
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
 static struct TimerData *timer_data;
-static int timer_data_max, timer_data_num;
-static int *free_timer_list;
-static int free_timer_list_max, free_timer_list_pos;
-
-static int timer_heap_max;
-static int *timer_heap = NULL;
-
-// for debug
-struct timer_func_list
-{
-    int  (*func) (int, unsigned int, int, int);
-    struct timer_func_list *next;
-    char *name;
-};
-static struct timer_func_list *tfl_root;
-
-#if defined(LCCWIN32)
-void gettimeofday (struct timeval *t, struct timezone *dummy)
-{
-    DWORD millisec = GetTickCount ();
-
-    t->tv_sec = (int) (millisec / 1000);
-    t->tv_usec = (millisec % 1000) * 1000;
-}
-
-#endif
-
-//
-int add_timer_func_list (int (*func) (int, unsigned int, int, int),
-                         char *name)
-{
-    struct timer_func_list *tfl;
-
-    CREATE (tfl, struct timer_func_list, 1);
-    CREATE (tfl->name, char, strlen (name) + 1);
-
-    tfl->next = tfl_root;
-    tfl->func = func;
-    strcpy (tfl->name, name);
-    tfl_root = tfl;
-
-    return 0;
-}
-
-char *search_timer_func_list (int (*func) (int, unsigned int, int, int))
-{
-    struct timer_func_list *tfl;
-    for (tfl = tfl_root; tfl; tfl = tfl->next)
-    {
-        if (func == tfl->func)
-            return tfl->name;
-    }
-    return "???";
-}
-
-/*----------------------------
- * 	Get tick time
- *----------------------------*/
-static unsigned int gettick_cache;
-static int gettick_count;
-unsigned int gettick_nocache (void)
+static uint32_t timer_data_max, timer_data_num;
+static timer_id *free_timer_list;
+static uint32_t free_timer_list_max, free_timer_list_pos;
+
+/// Okay, I think I understand this structure now:
+/// the timer heap is a magic queue that allows inserting timers and then popping them in order
+/// designed to copy only log2(N) entries instead of N
+// timer_heap[0] is the size (greatest index into the heap)
+// timer_heap[1] is the first actual element
+// timer_heap_max increases 256 at a time and never decreases
+static uint32_t timer_heap_max = 256;
+/// FIXME: refactor the code to put the size in a separate variable
+//nontrivial because indices get multiplied
+static timer_id *timer_heap = NULL;
+
+
+static uint32_t gettick_cache;
+static uint8_t gettick_count = 0;
+
+uint32_t gettick_nocache (void)
 {
     struct timeval tval;
+    // BUG: This will cause strange behavior if the system clock is changed!
+    // it should be reimplemented in terms of clock_gettime(CLOCK_MONOTONIC, )
     gettimeofday (&tval, NULL);
-    gettick_count = 256;
+    gettick_count = 255;
     return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000;
 }
 
-unsigned int gettick (void)
+uint32_t gettick (void)
 {
-    gettick_count--;
-    if (gettick_count < 0)
-        return gettick_nocache ();
-    return gettick_cache;
+    if (gettick_count--)
+        return gettick_cache;
+    return gettick_nocache ();
 }
 
-/*======================================
- * 	CORE : Timer Heap
- *--------------------------------------
- */
-static void push_timer_heap (int index)
+static void push_timer_heap (timer_id index)
 {
-    int  i, h;
-
-    if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max)
+    if (timer_heap == NULL)
     {
-        int  first = timer_heap == NULL;
-
         timer_heap_max += 256;
-        RECREATE (timer_heap, int, timer_heap_max);
-        memset (timer_heap + (timer_heap_max - 256), 0, sizeof (int) * 256);
-        if (first)
-            timer_heap[0] = 0;
+        CREATE (timer_heap, timer_id, timer_heap_max);
     }
-
+// timer_heap[0] is the greatest index into the heap, which increases
     timer_heap[0]++;
+    if (timer_heap[0] >= timer_heap_max)
+    {
+        timer_heap_max += 256;
+        RECREATE (timer_heap, timer_id, timer_heap_max);
+        memset (timer_heap + (timer_heap_max - 256), 0, 4 * 256);
+    }
 
-    for (h = timer_heap[0] - 1, i = (h - 1) / 2;
-         h > 0 && DIFF_TICK (timer_data[index].tick,
-                             timer_data[timer_heap[i + 1]].tick) < 0;
-         i = (h - 1) / 2)
+    timer_id h = timer_heap[0]-1, i = (h - 1) / 2;
+    while (h)
     {
+        // avoid wraparound problems, it really means this:
+        //   timer_data[index].tick >= timer_data[timer_heap[i+1]].tick
+        if ( DIFF_TICK(timer_data[index].tick, timer_data[timer_heap[i+1]].tick) >= 0)
+            break;
         timer_heap[h + 1] = timer_heap[i + 1];
         h = i;
+        i = (h - 1) / 2;
     }
     timer_heap[h + 1] = index;
 }
 
-static int top_timer_heap ()
+static timer_id top_timer_heap ()
 {
-    if (timer_heap == NULL || timer_heap[0] <= 0)
+    if (!timer_heap || !timer_heap[0])
         return -1;
-
     return timer_heap[1];
 }
 
-static int pop_timer_heap ()
+static timer_id pop_timer_heap ()
 {
-    int  i, h, k;
-    int  ret, last;
-
-    if (timer_heap == NULL || timer_heap[0] <= 0)
+    if (!timer_heap || !timer_heap[0])
         return -1;
-    ret = timer_heap[1];
-    last = timer_heap[timer_heap[0]];
+    timer_id ret = timer_heap[1];
+    timer_id last = timer_heap[timer_heap[0]];
     timer_heap[0]--;
 
+    uint32_t h, k;
     for (h = 0, k = 2; k < timer_heap[0]; k = k * 2 + 2)
     {
-        if (DIFF_TICK
-            (timer_data[timer_heap[k + 1]].tick,
-             timer_data[timer_heap[k]].tick) > 0)
+        if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick, timer_data[timer_heap[k]].tick) > 0)
             k--;
         timer_heap[h + 1] = timer_heap[k + 1], h = k;
     }
     if (k == timer_heap[0])
         timer_heap[h + 1] = timer_heap[k], h = k - 1;
 
-    for (i = (h - 1) / 2;
-         h > 0
-         && DIFF_TICK (timer_data[timer_heap[i + 1]].tick,
-                       timer_data[last].tick) > 0; i = (h - 1) / 2)
+    uint32_t i = (h - 1) / 2;
+    while (h)
     {
-        timer_heap[h + 1] = timer_heap[i + 1], h = i;
+        if (DIFF_TICK(timer_data[timer_heap[i + 1]].tick, timer_data[last].tick) <= 0)
+        timer_heap[h + 1] = timer_heap[i + 1];
+        h = i;
+        i = (h - 1) / 2;
     }
     timer_heap[h + 1] = last;
 
     return ret;
 }
 
-int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
-               int id, int data)
+timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, custom_data_t data)
 {
-    struct TimerData *td;
-    int  i;
+    timer_id i;
 
     if (free_timer_list_pos)
     {
+        // Retrieve a freed timer id instead of a new one
+        // I think it should be possible to avoid the loop somehow
         do
         {
             i = free_timer_list[--free_timer_list_pos];
@@ -187,12 +130,13 @@ int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
     }
     else
         i = timer_data_num;
+
+    // I have no idea what this is doing
     if (i >= timer_data_num)
-        for (i = timer_data_num; i < timer_data_max && timer_data[i].type;
-             i++);
+        for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++)
+            ;
     if (i >= timer_data_num && i >= timer_data_max)
     {
-        int  j;
         if (timer_data_max == 0)
         {
             timer_data_max = 256;
@@ -202,143 +146,112 @@ int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
         {
             timer_data_max += 256;
             RECREATE (timer_data, struct TimerData, timer_data_max);
-            if (timer_data == NULL)
-            {
-                printf ("out of memory : add_timer timer_data\n");
-                exit (1);
-            }
             memset (timer_data + (timer_data_max - 256), 0,
                     sizeof (struct TimerData) * 256);
         }
-        for (j = timer_data_max - 256; j < timer_data_max; j++)
-            timer_data[j].type = 0;
     }
-    td = &timer_data[i];
-    td->tick = tick;
-    td->func = func;
-    td->id = id;
-    td->data = data;
-    td->type = TIMER_ONCE_AUTODEL;
-    td->interval = 1000;
+    timer_data[i].tick = tick;
+    timer_data[i].func = func;
+    timer_data[i].id   = id;
+    timer_data[i].data = data;
+    timer_data[i].type = TIMER_ONCE_AUTODEL;
+    timer_data[i].interval = 1000;
     push_timer_heap (i);
     if (i >= timer_data_num)
         timer_data_num = i + 1;
     return i;
 }
 
-int add_timer_interval (unsigned int tick,
-                        int (*func) (int, unsigned int, int, int), int id,
-                        int data, int interval)
+timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id,
+                             custom_data_t data, interdb_val_t interval)
 {
-    int  tid;
-    tid = add_timer (tick, func, id, data);
+    timer_id tid = add_timer (tick, func, id, data);
     timer_data[tid].type = TIMER_INTERVAL;
     timer_data[tid].interval = interval;
     return tid;
 }
 
-int delete_timer (int id, int (*func) (int, unsigned int, int, int))
+void delete_timer (timer_id id, timer_func func)
 {
-    if (id <= 0 || id >= timer_data_num)
+    if (id == 0 || id >= timer_data_num)
     {
-        printf ("delete_timer error : no such timer %d\n", id);
-        return -1;
+        fprintf (stderr, "delete_timer error : no such timer %d\n", id);
+        abort ();
     }
     if (timer_data[id].func != func)
     {
-        printf
-            ("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n",
-             (int) timer_data[id].func,
-             search_timer_func_list (timer_data[id].func), (int) func,
-             search_timer_func_list (func));
-        return -2;
+        fprintf (stderr, "Timer mismatch\n");
+        abort ();
     }
-    // そのうち消えるにまかせる
+    // "to let them disappear" - is this just in case?
     timer_data[id].func = NULL;
     timer_data[id].type = TIMER_ONCE_AUTODEL;
     timer_data[id].tick -= 60 * 60 * 1000;
-    return 0;
 }
 
-int addtick_timer (int tid, unsigned int tick)
+tick_t addtick_timer (timer_id tid, interdb_val_t tick)
 {
     return timer_data[tid].tick += tick;
 }
 
-struct TimerData *get_timer (int tid)
+struct TimerData *get_timer (timer_id tid)
 {
     return &timer_data[tid];
 }
 
-int do_timer (unsigned int tick)
+interdb_val_t do_timer (tick_t tick)
 {
-    int  i, nextmin = 1000;
-
-#if 0
-    static int disp_tick = 0;
-    if (DIFF_TICK (disp_tick, tick) < -5000
-        || DIFF_TICK (disp_tick, tick) > 5000)
-    {
-        printf ("timer %d(%d + %d)\n", timer_data_num, timer_heap[0],
-                free_timer_list_pos);
-        disp_tick = tick;
-    }
-#endif
+    timer_id i;
+    /// Number of milliseconds until it calls this again
+    // this says to wait 1 sec if all timers get popped
+    interdb_val_t nextmin = 1000;
 
-    while ((i = top_timer_heap ()) >= 0)
+    while ((i = top_timer_heap ()) != (timer_id)-1)
     {
+        // while the heap is not empty and
         if (DIFF_TICK (timer_data[i].tick, tick) > 0)
         {
+            /// Return the time until the next timer needs to goes off
             nextmin = DIFF_TICK (timer_data[i].tick, tick);
             break;
         }
         pop_timer_heap ();
-        timer_data[i].type |= TIMER_REMOVE_HEAP;
         if (timer_data[i].func)
         {
             if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
             {
-                // 1秒以上の大幅な遅延が発生しているので、
-                // timer処理タイミングを現在値とする事で
-                // 呼び出し時タイミング(引数のtick)相対で処理してる
-                // timer関数の次回処理タイミングを遅らせる
-                timer_data[i].func (i, tick, timer_data[i].id,
-                                    timer_data[i].data);
+                // If we are too far past the requested tick, call with the current tick instead to fix reregistering problems
+                timer_data[i].func (i, tick, timer_data[i].id, timer_data[i].data);
             }
             else
             {
-                timer_data[i].func (i, timer_data[i].tick, timer_data[i].id,
-                                    timer_data[i].data);
+                timer_data[i].func (i, timer_data[i].tick, timer_data[i].id, timer_data[i].data);
             }
         }
-        if (timer_data[i].type & TIMER_REMOVE_HEAP)
+        switch (timer_data[i].type)
         {
-            switch (timer_data[i].type & ~TIMER_REMOVE_HEAP)
-            {
-                case TIMER_ONCE_AUTODEL:
-                    timer_data[i].type = 0;
-                    if (free_timer_list_pos >= free_timer_list_max)
-                    {
-                        free_timer_list_max += 256;
-                        RECREATE (free_timer_list, int, free_timer_list_max);
-                        memset (free_timer_list + (free_timer_list_max - 256),
-                                0, 256 * sizeof (free_timer_list[0]));
-                    }
-                    free_timer_list[free_timer_list_pos++] = i;
-                    break;
-                case TIMER_INTERVAL:
-                    if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
-                    {
-                        timer_data[i].tick = tick + timer_data[i].interval;
-                    }
-                    else
-                    {
-                        timer_data[i].tick += timer_data[i].interval;
-                    }
-                    timer_data[i].type &= ~TIMER_REMOVE_HEAP;
-                    push_timer_heap (i);
-                    break;
-            }
+            case TIMER_ONCE_AUTODEL:
+                timer_data[i].type = 0;
+                if (free_timer_list_pos >= free_timer_list_max)
+                {
+                    free_timer_list_max += 256;
+                    RECREATE (free_timer_list, uint32_t, free_timer_list_max);
+                    memset (free_timer_list + (free_timer_list_max - 256),
+                            0, 256 * sizeof (timer_id));
+                }
+                free_timer_list[free_timer_list_pos++] = i;
+                break;
+            case TIMER_INTERVAL:
+                if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
+                {
+                    timer_data[i].tick = tick + timer_data[i].interval;
+                }
+                else
+                {
+                    timer_data[i].tick += timer_data[i].interval;
+                }
+                push_timer_heap (i);
+                break;
         }
     }
 
@@ -346,8 +259,3 @@ int do_timer (unsigned int tick)
         nextmin = 10;
     return nextmin;
 }
-
-void timer_final ()
-{
-    free (timer_data);
-}
diff --git a/src/common/timer.h b/src/common/timer.h
index c6c4b52..4fa5db8 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -1,47 +1,67 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
+#ifndef TIMER_H
+#define TIMER_H
 
-#ifndef	_TIMER_H_
-#define	_TIMER_H_
+# include "sanity.h"
 
-#define BASE_TICK 5
-
-#define TIMER_ONCE_AUTODEL 1
-#define TIMER_INTERVAL 2
-#define TIMER_REMOVE_HEAP 16
-
-#define DIFF_TICK(a,b) ((int)((a)-(b)))
+enum TIMER_TYPE {
+    TIMER_ONCE_AUTODEL = 1,
+    TIMER_INTERVAL = 2,
+};
+/// This is needed to produce a signed result when 2 ticks are subtracted
+# define DIFF_TICK(a,b) ((int32_t)((a)-(b)))
 
-// Struct declaration
+// TODO replace with signed 64-bit to make code more clear and protect from the future
+typedef uint32_t tick_t;
+typedef uint32_t interdb_val_t;
+typedef uint32_t timer_id;
+// BUG: pointers are stored in here
+typedef int32_t custom_id_t;
+typedef int32_t custom_data_t;
+typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t);
 
 struct TimerData
 {
-    unsigned int tick;
-    int  (*func) (int, unsigned int, int, int);
-    int  id;
-    int  data;
-    int  type;
-    int  interval;
-    int  heap_pos;
+    /// When it will be triggered
+    tick_t tick;
+    /// What will be done
+    timer_func func;
+    /// Arbitrary data. WARNING, callers are stupid and put pointers in here
+    // Should we change to void* or intptr_t ?
+    custom_id_t  id;
+    custom_data_t  data;
+    /// Type of timer - 0 initially
+    enum TIMER_TYPE type;
+    /// Repeat rate
+    uint32_t interval;
 };
 
-// Function prototype declaration
-
-unsigned int gettick_nocache (void);
-unsigned int gettick (void);
+/// Server time, in milliseconds, since the epoch,
+/// but use of 32-bit integers means it wraps every 49 days.
+// The only external caller of this function is the core.c main loop, but that makes sense
+// in fact, it might make more sense if gettick() ALWAYS returned that cached value
+tick_t gettick_nocache (void);
+/// This function is called enough that it's worth caching the result for
+/// the next 255 times
+tick_t gettick (void);
 
-int  add_timer (unsigned int, int (*)(int, unsigned int, int, int), int, int);
-int  add_timer_interval (unsigned int, int (*)(int, unsigned int, int, int),
-                         int, int, int);
-int  delete_timer (int, int (*)(int, unsigned int, int, int));
+timer_id add_timer (tick_t tick, timer_func func, custom_id_t id,
+                    custom_data_t data);
+timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id,
+                             custom_data_t data, interdb_val_t interval);
+void delete_timer (timer_id, timer_func);
 
-int  addtick_timer (int tid, unsigned int tick);
-struct TimerData *get_timer (int tid);
+tick_t addtick_timer (timer_id tid, interdb_val_t tick);
+struct TimerData *get_timer (timer_id tid);
 
-int  do_timer (unsigned int tick);
+/// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens
+interdb_val_t do_timer (tick_t tick);
 
-int  add_timer_func_list (int (*)(int, unsigned int, int, int), char *);
-char *search_timer_func_list (int (*)(int, unsigned int, int, int));
+// debugging
+static void add_timer_func_list (timer_func, char *) __attribute__((deprecated));
+static inline void add_timer_func_list (timer_func UNUSED, char *UNUSED) {}
 
-extern void timer_final ();
+// used to just call free(), which doesn't matter when we're exiting
+static void timer_final () __attribute__((deprecated));
+static inline void timer_final() {};
 
-#endif // _TIMER_H_
+#endif // TIMER_H
diff --git a/src/common/utils.c b/src/common/utils.c
deleted file mode 100644
index 1433a5e..0000000
--- a/src/common/utils.c
+++ /dev/null
@@ -1,121 +0,0 @@
-#include <string.h>
-#include "utils.h"
-#include <stdio.h>
-
-void dump (unsigned char *buffer, int num)
-{
-    int  icnt, jcnt;
-
-    printf
-        ("         Hex                                                  ASCII\n");
-    printf
-        ("         -----------------------------------------------      ----------------");
-
-    for (icnt = 0; icnt < num; icnt += 16)
-    {
-        printf ("\n%p ", &buffer[icnt]);
-        for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
-        {
-            if (jcnt < num)
-            {
-                printf ("%02hX ", buffer[jcnt]);
-            }
-            else
-                printf ("   ");
-        }
-
-        printf ("  |  ");
-
-        for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
-        {
-            if (jcnt < num)
-            {
-                if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
-                    printf ("%c", buffer[jcnt]);
-                else
-                    printf (".");
-            }
-            else
-                printf (" ");
-        }
-    }
-    printf ("\n");
-}
-
-#ifdef LCCWIN32
-char *rindex (char *str, char c)
-{
-    char *sptr;
-
-    sptr = str;
-    while (*sptr)
-        ++sptr;
-    if (c == '\0')
-        return (sptr);
-    while (str != sptr)
-        if (*sptr-- == c)
-            return (++sptr);
-    return (NULL);
-}
-
-int strcasecmp (const char *arg1, const char *arg2)
-{
-    int  chk, i;
-
-    if (arg1 == NULL || arg2 == NULL)
-    {
-        printf ("SYSERR: str_cmp() passed a NULL pointer, %p or %p.\n", arg1,
-                arg2);
-        return (0);
-    }
-
-    for (i = 0; arg1[i] || arg2[i]; i++)
-        if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0)
-            return (chk);       /* not equal */
-
-    return (0);
-}
-
-int strncasecmp (const char *arg1, const char *arg2, int n)
-{
-    int  chk, i;
-
-    if (arg1 == NULL || arg2 == NULL)
-    {
-        printf ("SYSERR: strn_cmp() passed a NULL pointer, %p or %p.\n", arg1,
-                arg2);
-        return (0);
-    }
-
-    for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--)
-        if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0)
-            return (chk);       /* not equal */
-
-    return (0);
-}
-
-void str_upper (char *name)
-{
-
-    int  len = strlen (name);
-    while (len--)
-    {
-        if (*name >= 'a' && *name <= 'z')
-            *name -= ('a' - 'A');
-        name++;
-    }
-}
-
-void str_lower (char *name)
-{
-    int  len = strlen (name);
-
-    while (len--)
-    {
-        if (*name >= 'A' && *name <= 'Z')
-            *name += ('a' - 'A');
-        name++;
-    }
-}
-
-#endif
diff --git a/src/common/utils.h b/src/common/utils.h
index 10c10ad..961d960 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -1,39 +1,18 @@
-#include "mt_rand.h"
-
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-#define LOWER(c)   (((c)>='A'  && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))
-#define UPPER(c)   (((c)>='a'  && (c) <= 'z') ? ((c)+('A'-'a')) : (c) )
-
-/* strcasecmp -> stricmp -> str_cmp */
-
-#ifdef LCCWIN32
-int  strcasecmp (const char *arg1, const char *arg2);
-int  strncasecmp (const char *arg1, const char *arg2, int n);
-void str_upper (char *name);
-void str_lower (char *name);
-char *rindex (char *str, char c);
-#endif
-
-void dump (unsigned char *buffer, int num);
-
-#define CREATE(result, type, number)  do {\
-   if ((number) * sizeof(type) <= 0)   \
-      printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__);   \
+#ifndef UTILS_H
+#define UTILS_H
+/*
+Notes about memory allocation in tmwAthena:
+There used to be 3 sources of allocation: these macros,
+a{C,M,Re}alloc in common/malloc.{h,c}, and direct calls.
+I deleted malloc.{h,c} because it was redundant;
+future calls should either use this or depend on the coming segfault.
+*/
+# define CREATE(result, type, number) \
    if (!((result) = (type *) calloc ((number), sizeof(type))))   \
-      { perror("SYSERR: malloc failure"); abort(); } } while(0)
+      { perror("SYSERR: malloc failure"); abort(); } else (void)0
 
-#define RECREATE(result,type,number) do {\
+# define RECREATE(result,type,number) \
   if (!((result) = (type *) realloc ((result), sizeof(type) * (number))))\
-      { printf("SYSERR: realloc failure"); abort(); } } while(0)
+      { perror("SYSERR: realloc failure"); abort(); } else (void)0
 
-/*
- * ModuloRand and ModuloPlusRand. These macros are used to replace the
- * vast number of calls to rand()%mod ..
- * MRAND(10), returns 0-9.
- * MPRAND(5,10) returns 5-14.
- */
-#define MRAND(mod) (int) (mt_random() % (mod))
-#define MPRAND(add, mod) add + MRAND(mod)
+#endif //UTILS_H
diff --git a/src/common/version.h b/src/common/version.h
index cd9808e..46165aa 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -1,27 +1,24 @@
-// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $
-#ifndef _VERSION_H_
-#define _VERSION_H_
+/// Some constants to identify the version of (e)Athena
+/// The values are different if the client connects (-1,'T','M','W',flags32)
+// These numbers have never been changed while TMW
+#ifndef VERSION_H
+#define VERSION_H
+//When a server receives a 0x7530 packet from an admin connection,
+//it sends an 0x7531 packet with the following bytes
+# define ATHENA_MAJOR_VERSION    1   // Major Version
+# define ATHENA_MINOR_VERSION    0   // Minor Version
+# define ATHENA_REVISION         0   // Revision
 
-#define ATHENA_MAJOR_VERSION	1   // Major Version
-#define ATHENA_MINOR_VERSION	0   // Minor Version
-#define ATHENA_REVISION			0   // Revision
+# define ATHENA_RELEASE_FLAG     1   // 1=Develop,0=Stable
+# define ATHENA_OFFICIAL_FLAG    1   // 1=Mod,0=Official
 
-#define ATHENA_RELEASE_FLAG		1   // 1=Develop,0=Stable
-#define ATHENA_OFFICIAL_FLAG	1   // 1=Mod,0=Official
+// and a bitmask of these (the char server sends char and inter)
+# define ATHENA_SERVER_LOGIN     1   // login server
+# define ATHENA_SERVER_CHAR      2   // char server
+# define ATHENA_SERVER_INTER     4   // inter server
+# define ATHENA_SERVER_MAP       8   // map server
 
-#define ATHENA_SERVER_LOGIN		1   // login server
-#define ATHENA_SERVER_CHAR		2   // char server
-#define ATHENA_SERVER_INTER		4   // inter server
-#define ATHENA_SERVER_MAP		8   // map server
+// and this as two bytes
+# define ATHENA_MOD_VERSION   1052   // mod version (patch No.)
 
-// ATHENA_MOD_VERSIONはパッチ番号です。
-// これは無理に変えなくても気が向いたら変える程度の扱いで。
-// (毎回アップロードの度に変更するのも面倒と思われるし、そもそも
-//  この項目を参照する人がいるかどうかで疑問だから。)
-// その程度の扱いなので、サーバーに問い合わせる側も、あくまで目安程度の扱いで
-// あんまり信用しないこと。
-// 鯖snapshotの時や、大きな変更があった場合は設定してほしいです。
-// C言語の仕様上、最初に0を付けると8進数になるので間違えないで下さい。
-#define ATHENA_MOD_VERSION	1052    // mod version (patch No.)
-
-#endif
+#endif // VERSION_H
diff --git a/src/ladmin/Makefile b/src/ladmin/Makefile
index e873e69..4b4d2ec 100644
--- a/src/ladmin/Makefile
+++ b/src/ladmin/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
 
 all: ladmin
 
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/mt_rand.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/mt_rand.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/mt_rand.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/mt_rand.h
 
 ladmin: ladmin.o ../common/md5calc.o $(COMMON_OBJ)
 ladmin.o: ladmin.c ladmin.h ../common/md5calc.h $(COMMON_H)
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
index 6848152..49f52ca 100644
--- a/src/ladmin/ladmin.c
+++ b/src/ladmin/ladmin.c
@@ -36,7 +36,7 @@
 #include "memwatch.h"
 #endif
 
-extern int eathena_interactive_session; // from core.c
+int eathena_interactive_session; // from core.c
 #define Iprintf if (eathena_interactive_session) printf
 
 //-------------------------------INSTRUCTIONS------------------------------
@@ -4737,7 +4737,7 @@ int prompt ()
 //-------------------------------------------------------------
 // Function: Parse receiving informations from the login-server
 //-------------------------------------------------------------
-int parse_fromlogin (int fd)
+void parse_fromlogin (int fd)
 {
     struct char_session_data *sd;
 
@@ -4775,7 +4775,7 @@ int parse_fromlogin (int fd)
         {
             case 0x7919:       // answer of a connection request
                 if (RFIFOREST (fd) < 3)
-                    return 0;
+                    return;
                 if (RFIFOB (fd, 2) != 0)
                 {
                     if (defaultlanguage == 'F')
@@ -4834,7 +4834,7 @@ int parse_fromlogin (int fd)
 #ifdef PASSWORDENC
             case 0x01dc:       // answer of a coding key request
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     char md5str[64] =
                         "", md5bin[32], md5key[RFIFOW (fd, 2) - 4 + 1];
@@ -4851,7 +4851,7 @@ int parse_fromlogin (int fd)
                                  sizeof (loginserveradminpassword));
                         strcat (md5str, RFIFOP (fd, 4));
                     }
-                    MD5_String2binary (md5str, md5bin);
+                    MD5_to_bin(MD5_from_cstring(md5str), md5bin);
                     WFIFOW (login_fd, 0) = 0x7918;  // Request for administation login (encrypted password)
                     WFIFOW (login_fd, 2) = passenc; // Encrypted type
                     memcpy (WFIFOP (login_fd, 4), md5bin, 16);
@@ -4880,7 +4880,7 @@ int parse_fromlogin (int fd)
 
             case 0x7531:       // Displaying of the version of the login-server
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 Iprintf ("  Login-Server [%s:%d]\n", loginserverip,
                          loginserverport);
                 if (((int) RFIFOB (login_fd, 5)) == 0)
@@ -4914,7 +4914,7 @@ int parse_fromlogin (int fd)
 
             case 0x7921:       // Displaying of the list of accounts
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 if (RFIFOW (fd, 2) < 5)
                 {
                     if (defaultlanguage == 'F')
@@ -5064,7 +5064,7 @@ int parse_fromlogin (int fd)
 
             case 0x7931:       // Answer of login-server about an account creation
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5111,7 +5111,7 @@ int parse_fromlogin (int fd)
 
             case 0x7933:       // Answer of login-server about an account deletion
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5159,7 +5159,7 @@ int parse_fromlogin (int fd)
 
             case 0x7935:       // answer of the change of an account password
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5211,7 +5211,7 @@ int parse_fromlogin (int fd)
 
             case 0x7937:       // answer of the change of an account state
                 if (RFIFOREST (fd) < 34)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5301,7 +5301,7 @@ int parse_fromlogin (int fd)
 
             case 0x7939:       // answer of the number of online players
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     // Get length of the received packet
                     int  i;
@@ -5360,7 +5360,7 @@ int parse_fromlogin (int fd)
 
             case 0x793b:       // answer of the check of a password
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5409,7 +5409,7 @@ int parse_fromlogin (int fd)
 
             case 0x793d:       // answer of the change of an account sex
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5463,7 +5463,7 @@ int parse_fromlogin (int fd)
 
             case 0x793f:       // answer of the change of an account GM level
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5521,7 +5521,7 @@ int parse_fromlogin (int fd)
 
             case 0x7941:       // answer of the change of an account email
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5573,7 +5573,7 @@ int parse_fromlogin (int fd)
 
             case 0x7943:       // answer of the change of an account memo
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5622,7 +5622,7 @@ int parse_fromlogin (int fd)
 
             case 0x7945:       // answer of an account id search
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5667,7 +5667,7 @@ int parse_fromlogin (int fd)
 
             case 0x7947:       // answer of an account name search
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 if (strcmp (RFIFOP (fd, 6), "") == 0)
                 {
                     if (defaultlanguage == 'F')
@@ -5712,7 +5712,7 @@ int parse_fromlogin (int fd)
 
             case 0x7949:       // answer of an account validity limit set
                 if (RFIFOREST (fd) < 34)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5791,7 +5791,7 @@ int parse_fromlogin (int fd)
 
             case 0x794b:       // answer of an account ban set
                 if (RFIFOREST (fd) < 34)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5870,7 +5870,7 @@ int parse_fromlogin (int fd)
 
             case 0x794d:       // answer of an account ban date/time changing
                 if (RFIFOREST (fd) < 34)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5949,7 +5949,7 @@ int parse_fromlogin (int fd)
 
             case 0x794f:       // answer of a broadcast
                 if (RFIFOREST (fd) < 4)
-                    return 0;
+                    return;
                 if (RFIFOW (fd, 2) == (unsigned short) -1)
                 {
                     if (defaultlanguage == 'F')
@@ -5994,7 +5994,7 @@ int parse_fromlogin (int fd)
 
             case 0x7951:       // answer of an account validity limit changing
                 if (RFIFOREST (fd) < 34)
-                    return 0;
+                    return;
                 if (RFIFOL (fd, 2) == -1)
                 {
                     if (defaultlanguage == 'F')
@@ -6082,7 +6082,7 @@ int parse_fromlogin (int fd)
             case 0x7953:       // answer of a request about informations of an account (by account name/id)
                 if (RFIFOREST (fd) < 150
                     || RFIFOREST (fd) < (150 + RFIFOW (fd, 148)))
-                    return 0;
+                    return;
                 {
                     char userid[24], error_message[20], lastlogin[24],
                         last_ip[16], email[40], memo[255];
@@ -6328,14 +6328,12 @@ int parse_fromlogin (int fd)
                     ("Remote administration has been disconnected (unknown packet).\n");
                 ladmin_log ("'End of connection, unknown packet." RETCODE);
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
     }
 
     // if we don't wait new packets, do the prompt
     prompt ();
-
-    return 0;
 }
 
 //------------------------------------
@@ -6406,12 +6404,12 @@ int Connect_login_server ()
 //-------------------------------------------------
 int config_switch (const char *str)
 {
-    if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
-        || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
-        || strcmpi (str, "si") == 0)
+    if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+        || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+        || strcasecmp (str, "si") == 0)
         return 1;
-    if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
-        || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+    if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+        || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
         return 0;
 
     return atoi (str);
@@ -6463,7 +6461,7 @@ int ladmin_config_read (const char *cfgName)
             remove_control_chars (w1);
             remove_control_chars (w2);
 
-            if (strcmpi (w1, "login_ip") == 0)
+            if (strcasecmp (w1, "login_ip") == 0)
             {
                 struct hostent *h = gethostbyname (w2);
                 if (h != NULL)
@@ -6495,11 +6493,11 @@ int ladmin_config_read (const char *cfgName)
                 else
                     memcpy (loginserverip, w2, 16);
             }
-            else if (strcmpi (w1, "login_port") == 0)
+            else if (strcasecmp (w1, "login_port") == 0)
             {
                 loginserverport = atoi (w2);
             }
-            else if (strcmpi (w1, "admin_pass") == 0)
+            else if (strcasecmp (w1, "admin_pass") == 0)
             {
                 strncpy (loginserveradminpassword, w2,
                          sizeof (loginserveradminpassword));
@@ -6507,25 +6505,25 @@ int ladmin_config_read (const char *cfgName)
                                          1] = '\0';
 #ifdef PASSWORDENC
             }
-            else if (strcmpi (w1, "passenc") == 0)
+            else if (strcasecmp (w1, "passenc") == 0)
             {
                 passenc = atoi (w2);
                 if (passenc < 0 || passenc > 2)
                     passenc = 0;
 #endif
             }
-            else if (strcmpi (w1, "defaultlanguage") == 0)
+            else if (strcasecmp (w1, "defaultlanguage") == 0)
             {
                 if (w2[0] == 'F' || w2[0] == 'E')
                     defaultlanguage = w2[0];
             }
-            else if (strcmpi (w1, "ladmin_log_filename") == 0)
+            else if (strcasecmp (w1, "ladmin_log_filename") == 0)
             {
                 strncpy (ladmin_log_filename, w2,
                          sizeof (ladmin_log_filename));
                 ladmin_log_filename[sizeof (ladmin_log_filename) - 1] = '\0';
             }
-            else if (strcmpi (w1, "date_format") == 0)
+            else if (strcasecmp (w1, "date_format") == 0)
             {                   // note: never have more than 19 char for the date!
                 switch (atoi (w2))
                 {
@@ -6543,7 +6541,7 @@ int ladmin_config_read (const char *cfgName)
                         break;
                 }
             }
-            else if (strcmpi (w1, "import") == 0)
+            else if (strcasecmp (w1, "import") == 0)
             {
                 ladmin_config_read (w2);
             }
@@ -6568,7 +6566,7 @@ int ladmin_config_read (const char *cfgName)
 //--------------------------------------
 // Function called at exit of the server
 //--------------------------------------
-void do_final (void)
+void term_func (void)
 {
 
     if (already_exit_function == 0)
@@ -6601,6 +6599,7 @@ void do_final (void)
 //------------------------
 int do_init (int argc, char **argv)
 {
+    eathena_interactive_session = isatty (0);
     // read ladmin configuration
     ladmin_config_read ((argc > 1) ? argv[1] : LADMIN_CONF_NAME);
 
@@ -6616,7 +6615,6 @@ int do_init (int argc, char **argv)
 
     srand (time (NULL));
 
-    set_termfunc (do_final);
     set_defaultparse (parse_fromlogin);
 
     if (defaultlanguage == 'F')
@@ -6645,7 +6643,7 @@ int do_init (int argc, char **argv)
 
     Connect_login_server ();
 
-    atexit (do_final);
+    atexit (term_func);
 
     return 0;
 }
diff --git a/src/login/Makefile b/src/login/Makefile
index 8a7e5a6..bc1e7c0 100644
--- a/src/login/Makefile
+++ b/src/login/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
 
 all: login
 
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/mt_rand.o ../common/md5calc.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/mt_rand.h ../common/md5calc.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/mt_rand.o ../common/md5calc.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/mt_rand.h ../common/md5calc.h
 
 login: $(COMMON_OBJ)
 login.o: login.c login.h $(COMMON_H)
diff --git a/src/login/login.c b/src/login/login.c
index 480533e..6788371 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -219,12 +219,7 @@ int read_gm_account ()
         if ((line[0] == '/' && line[1] == '/') || line[0] == '\0'
             || line[0] == '\n' || line[0] == '\r')
             continue;
-        p = calloc (sizeof (struct gm_account), 1);
-        if (p == NULL)
-        {
-            printf ("read_gm_account: memory allocation failure (malloc)!\n");
-            exit (0);
-        }
+        CREATE (p, struct gm_account, 1);
         if (sscanf (line, "%d %d", &p->account_id, &p->level) != 2
             && sscanf (line, "%d: %d", &p->account_id, &p->level) != 2)
             printf
@@ -492,7 +487,7 @@ int search_account_index (char *account_name)
     for (i = 0; i < auth_num; i++)
     {
         // Without case sensitive check (increase the number of similar account names found)
-        if (stricmp (auth_dat[i].userid, account_name) == 0)
+        if (strcasecmp (auth_dat[i].userid, account_name) == 0)
         {
             // Strict comparison (if found, we finish the function immediatly with correct value)
             if (strcmp (auth_dat[i].userid, account_name) == 0)
@@ -551,7 +546,7 @@ int mmo_auth_init (void)
     int  GM_count = 0;
     int  server_count = 0;
 
-    auth_dat = calloc (sizeof (struct auth_dat) * 256, 1);
+    CREATE (auth_dat, struct auth_dat, 256);
     auth_max = 256;
 
     fp = fopen_ (account_filename, "r");
@@ -650,8 +645,7 @@ int mmo_auth_init (void)
             if (auth_num >= auth_max)
             {
                 auth_max += 256;
-                auth_dat =
-                    realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+                RECREATE (auth_dat, struct auth_dat, auth_max);
             }
 
             memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat));
@@ -830,8 +824,7 @@ int mmo_auth_init (void)
             if (auth_num >= auth_max)
             {
                 auth_max += 256;
-                auth_dat =
-                    realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+                RECREATE (auth_dat, struct auth_dat, auth_max);
             }
 
             memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat));
@@ -1046,12 +1039,18 @@ void mmo_auth_sync (void)
     return;
 }
 
-// We want to sync the DB to disk as little as possible as it's fairly 
+void term_func (void)
+{
+    mmo_auth_sync ();
+}
+
+
+// We want to sync the DB to disk as little as possible as it's fairly
 // resource intensive. therefore most player-triggerable events that
 // update the account DB will not immideately trigger a save. Instead
 // we save periodicly on a timer.
 //-----------------------------------------------------
-int check_auth_sync (int tid, unsigned int tick, int id, int data)
+void check_auth_sync (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     if (pid != 0)
     {
@@ -1061,14 +1060,14 @@ int check_auth_sync (int tid, unsigned int tick, int id, int data)
         // Need to check status too?
         if (temp == 0)
         {
-            return 0;
+            return;
         }
     }
 
     // This can take a lot of time. Fork a child to handle the work and return at once
     // If we're unable to fork just continue running the function normally
     if ((pid = fork ()) > 0)
-        return 0;
+        return;
 
     mmo_auth_sync ();
 
@@ -1076,7 +1075,7 @@ int check_auth_sync (int tid, unsigned int tick, int id, int data)
     if (pid == 0)
         _exit (0);
 
-    return 0;
+    return;
 }
 
 //--------------------------------------------------------------------
@@ -1128,14 +1127,14 @@ void send_GM_accounts ()
 //-----------------------------------------------------
 // Check if GM file account have been changed
 //-----------------------------------------------------
-int check_GM_file (int tid, unsigned int tick, int id, int data)
+void check_GM_file (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct stat file_stat;
     long new_time;
 
     // if we would not check
     if (gm_account_filename_check_timer < 1)
-        return 0;
+        return;
 
     // get last modify time/date
     if (stat (GM_account_filename, &file_stat))
@@ -1148,8 +1147,6 @@ int check_GM_file (int tid, unsigned int tick, int id, int data)
         read_gm_account ();
         send_GM_accounts ();
     }
-
-    return 0;
 }
 
 //-------------------------------------
@@ -1164,7 +1161,7 @@ int mmo_auth_new (struct mmo_account *account, char sex, char *email)
     if (auth_num >= auth_max)
     {
         auth_max += 256;
-        auth_dat = realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+        RECREATE (auth_dat, struct auth_dat, auth_max);
     }
 
     memset (&auth_dat[i], '\0', sizeof (struct auth_dat));
@@ -1446,7 +1443,7 @@ int mmo_auth (struct mmo_account *account, int fd)
 //-------------------------------
 // Char-server anti-freeze system
 //-------------------------------
-int char_anti_freeze_system (int tid, unsigned int tick, int id, int data)
+void char_anti_freeze_system (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  i;
 
@@ -1468,14 +1465,12 @@ int char_anti_freeze_system (int tid, unsigned int tick, int id, int data)
             }
         }
     }
-
-    return 0;
 }
 
 //--------------------------------
 // Packet parsing for char-servers
 //--------------------------------
-int parse_fromchar (int fd)
+void parse_fromchar (int fd)
 {
     int  i, j, id;
     unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
@@ -1498,7 +1493,7 @@ int parse_fromchar (int fd)
         }
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     while (RFIFOREST (fd) >= 2)
@@ -1523,7 +1518,7 @@ int parse_fromchar (int fd)
 
             case 0x2712:       // request from char-server to authentify an account
                 if (RFIFOREST (fd) < 19)
-                    return 0;
+                    return;
                 {
                     int  acc;
                     acc = RFIFOL (fd, 2);   // speed up
@@ -1598,7 +1593,7 @@ int parse_fromchar (int fd)
 
             case 0x2714:
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2));
                 server[id].users = RFIFOL (fd, 2);
                 if (anti_freeze_enable)
@@ -1612,7 +1607,7 @@ int parse_fromchar (int fd)
                 int  acc;
                 char email[40];
                 if (RFIFOREST (fd) < 46)
-                    return 0;
+                    return;
                 acc = RFIFOL (fd, 2);   // speed up
                 memcpy (email, RFIFOP (fd, 6), 40);
                 email[39] = '\0';
@@ -1649,7 +1644,7 @@ int parse_fromchar (int fd)
             }
             case 0x2716:
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
                 for (i = 0; i < auth_num; i++)
                 {
@@ -1678,7 +1673,7 @@ int parse_fromchar (int fd)
 
             case 0x2720:       // To become GM request
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     int  acc;
                     unsigned char buf[10];
@@ -1765,12 +1760,12 @@ int parse_fromchar (int fd)
                     charif_sendallwos (-1, buf, 10);
                 }
                 RFIFOSKIP (fd, RFIFOW (fd, 2));
-                return 0;
+                return;
 
                 // Map server send information to change an email of an account via char-server
             case 0x2722:       // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
                 if (RFIFOREST (fd) < 86)
-                    return 0;
+                    return;
                 {
                     int  acc;
                     char actual_email[40], new_email[40];
@@ -1789,7 +1784,7 @@ int parse_fromchar (int fd)
                         login_log
                             ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)"
                              RETCODE, server[id].name, acc, ip);
-                    else if (strcmpi (new_email, "a@a.com") == 0)
+                    else if (strcasecmp (new_email, "a@a.com") == 0)
                         login_log
                             ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)"
                              RETCODE, server[id].name, acc, ip);
@@ -1799,7 +1794,7 @@ int parse_fromchar (int fd)
                         {
                             if (auth_dat[i].account_id == acc)
                             {
-                                if (strcmpi (auth_dat[i].email, actual_email)
+                                if (strcasecmp (auth_dat[i].email, actual_email)
                                     == 0)
                                 {
                                     memcpy (auth_dat[i].email, new_email, 40);
@@ -1829,7 +1824,7 @@ int parse_fromchar (int fd)
                 // Receiving of map-server via char-server a status change resquest (by Yor)
             case 0x2724:
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 {
                     int  acc, statut;
                     acc = RFIFOL (fd, 2);
@@ -1874,11 +1869,11 @@ int parse_fromchar (int fd)
                     }
                     RFIFOSKIP (fd, 10);
                 }
-                return 0;
+                return;
 
             case 0x2725:       // Receiving of map-server via char-server a ban resquest (by Yor)
                 if (RFIFOREST (fd) < 18)
-                    return 0;
+                    return;
                 {
                     int  acc;
                     acc = RFIFOL (fd, 2);
@@ -1970,11 +1965,11 @@ int parse_fromchar (int fd)
                     }
                     RFIFOSKIP (fd, 18);
                 }
-                return 0;
+                return;
 
             case 0x2727:       // Change of sex (sex is reversed)
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 {
                     int  acc, sex;
                     acc = RFIFOL (fd, 2);
@@ -2020,11 +2015,11 @@ int parse_fromchar (int fd)
                     }
                     RFIFOSKIP (fd, 6);
                 }
-                return 0;
+                return;
 
             case 0x2728:       // We receive account_reg2 from a char-server, and we send them to other char-servers.
                 if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
-                    return 0;
+                    return;
                 {
                     int  acc, p;
                     acc = RFIFOL (fd, 4);
@@ -2071,7 +2066,7 @@ int parse_fromchar (int fd)
 
             case 0x272a:       // Receiving of map-server via char-server a unban resquest (by Yor)
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 {
                     int  acc;
                     acc = RFIFOL (fd, 2);
@@ -2103,12 +2098,12 @@ int parse_fromchar (int fd)
                     }
                     RFIFOSKIP (fd, 6);
                 }
-                return 0;
+                return;
 
                 // request from char-server to change account password
             case 0x2740:       // 0x2740 <account_id>.L <actual_password>.24B <new_password>.24B
                 if (RFIFOREST (fd) < 54)
-                    return 0;
+                    return;
                 {
                     int  acc;
                     char actual_pass[24], new_pass[24];
@@ -2218,16 +2213,16 @@ int parse_fromchar (int fd)
                 session[fd]->eof = 1;
                 printf
                     ("Char-server has been disconnected (unknown packet).\n");
-                return 0;
+                return;
         }
     }
-    return 0;
+    return;
 }
 
 //---------------------------------------
 // Packet parsing for administation login
 //---------------------------------------
-int parse_admin (int fd)
+void parse_admin (int fd)
 {
     int  i, j;
     unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
@@ -2242,7 +2237,7 @@ int parse_admin (int fd)
         delete_session (fd);
         printf ("Remote administration has disconnected (session #%d).\n",
                 fd);
-        return 0;
+        return;
     }
 
     while (RFIFOREST (fd) >= 2)
@@ -2278,7 +2273,7 @@ int parse_admin (int fd)
 
             case 0x7920:       // Request of an accounts list
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 {
                     int  st, ed, len;
                     int  id[auth_num];
@@ -2342,7 +2337,7 @@ int parse_admin (int fd)
             case 0x7924:
             {                   // [Fate] Itemfrob package: change item IDs
                 if (RFIFOREST (fd) < 10)
-                    return 0;
+                    return;
                 charif_sendallwos (-1, RFIFOP (fd, 0), 10); // forward package to char servers
                 RFIFOSKIP (fd, 10);
                 WFIFOW (fd, 0) = 0x7925;
@@ -2352,7 +2347,7 @@ int parse_admin (int fd)
 
             case 0x7930:       // Request for an account creation
                 if (RFIFOREST (fd) < 91)
-                    return 0;
+                    return;
                 {
                     struct mmo_account ma;
                     ma.userid = RFIFOP (fd, 2);
@@ -2423,7 +2418,7 @@ int parse_admin (int fd)
 
             case 0x7932:       // Request for an account deletion
                 if (RFIFOREST (fd) < 26)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7933;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2465,7 +2460,7 @@ int parse_admin (int fd)
 
             case 0x7934:       // Request to change a password
                 if (RFIFOREST (fd) < 50)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7935;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2495,7 +2490,7 @@ int parse_admin (int fd)
 
             case 0x7936:       // Request to modify a state
                 if (RFIFOREST (fd) < 50)
-                    return 0;
+                    return;
                 {
                     char error_message[20];
                     int  statut;
@@ -2593,7 +2588,7 @@ int parse_admin (int fd)
 
             case 0x793a:       // Request to password check
                 if (RFIFOREST (fd) < 50)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x793b;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2635,7 +2630,7 @@ int parse_admin (int fd)
 
             case 0x793c:       // Request to modify sex
                 if (RFIFOREST (fd) < 27)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x793d;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2707,7 +2702,7 @@ int parse_admin (int fd)
 
             case 0x793e:       // Request to modify GM level
                 if (RFIFOREST (fd) < 27)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x793f;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2829,26 +2824,15 @@ int parse_admin (int fd)
                                              RETCODE, auth_dat[i].userid, acc,
                                              (int) new_gm_level, ip);
                                     }
-                                    if (lock_fclose
-                                        (fp2, GM_account_filename,
-                                         &lock) == 0)
-                                    {
-                                        WFIFOL (fd, 2) = acc;
-                                        login_log
-                                            ("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)"
-                                             RETCODE, auth_dat[i].userid, acc,
-                                             (int) new_gm_level, ip);
-                                        // read and send new GM informations
-                                        read_gm_account ();
-                                        send_GM_accounts ();
-                                    }
-                                    else
-                                    {
-                                        login_log
-                                            ("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)"
-                                             RETCODE, auth_dat[i].userid, acc,
-                                             (int) new_gm_level, ip);
-                                    }
+                                    lock_fclose(fp2, GM_account_filename, &lock);
+                                    WFIFOL (fd, 2) = acc;
+                                    login_log
+                                        ("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)"
+                                            RETCODE, auth_dat[i].userid, acc,
+                                            (int) new_gm_level, ip);
+                                    // read and send new GM informations
+                                    read_gm_account ();
+                                    send_GM_accounts ();
                                 }
                                 else
                                 {
@@ -2881,7 +2865,7 @@ int parse_admin (int fd)
 
             case 0x7940:       // Request to modify e-mail
                 if (RFIFOREST (fd) < 66)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7941;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2925,7 +2909,7 @@ int parse_admin (int fd)
             case 0x7942:       // Request to modify memo field
                 if (RFIFOREST (fd) < 28
                     || RFIFOREST (fd) < (28 + RFIFOW (fd, 26)))
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7943;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -2971,7 +2955,7 @@ int parse_admin (int fd)
 
             case 0x7944:       // Request to found an account id
                 if (RFIFOREST (fd) < 26)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7945;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -3000,7 +2984,7 @@ int parse_admin (int fd)
 
             case 0x7946:       // Request to found an account name
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7947;
                 WFIFOL (fd, 2) = RFIFOL (fd, 2);
                 memset (WFIFOP (fd, 6), '\0', 24);
@@ -3028,7 +3012,7 @@ int parse_admin (int fd)
 
             case 0x7948:       // Request to change the validity limit (timestamp) (absolute value)
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 {
                     time_t timestamp;
                     char tmpstr[2048];
@@ -3066,7 +3050,7 @@ int parse_admin (int fd)
 
             case 0x794a:       // Request to change the final date of a banishment (timestamp) (absolute value)
                 if (RFIFOREST (fd) < 30)
-                    return 0;
+                    return;
                 {
                     time_t timestamp;
                     char tmpstr[2048];
@@ -3122,7 +3106,7 @@ int parse_admin (int fd)
 
             case 0x794c:       // Request to change the final date of a banishment (timestamp) (relative change)
                 if (RFIFOREST (fd) < 38)
-                    return 0;
+                    return;
                 {
                     time_t timestamp;
                     struct tm *tmtime;
@@ -3229,7 +3213,7 @@ int parse_admin (int fd)
             case 0x794e:       // Request to send a broadcast message
                 if (RFIFOREST (fd) < 8
                     || RFIFOREST (fd) < (8 + RFIFOL (fd, 4)))
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x794f;
                 WFIFOW (fd, 2) = -1;
                 if (RFIFOL (fd, 4) < 1)
@@ -3280,7 +3264,7 @@ int parse_admin (int fd)
 
             case 0x7950:       // Request to change the validity limite (timestamp) (relative change)
                 if (RFIFOREST (fd) < 38)
-                    return 0;
+                    return;
                 {
                     time_t timestamp;
                     struct tm *tmtime;
@@ -3384,7 +3368,7 @@ int parse_admin (int fd)
 
             case 0x7952:       // Request about informations of an account (by account name)
                 if (RFIFOREST (fd) < 26)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7953;
                 WFIFOL (fd, 2) = -1;
                 account_name = RFIFOP (fd, 2);
@@ -3434,7 +3418,7 @@ int parse_admin (int fd)
 
             case 0x7954:       // Request about information of an account (by account id)
                 if (RFIFOREST (fd) < 6)
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7953;
                 WFIFOL (fd, 2) = RFIFOL (fd, 2);
                 memset (WFIFOP (fd, 7), '\0', 24);
@@ -3550,12 +3534,12 @@ int parse_admin (int fd)
                 session[fd]->eof = 1;
                 printf
                     ("Remote administration has been disconnected (unknown packet).\n");
-                return 0;
+                return;
         }
         //WFIFOW(fd,0) = 0x791f;
         //WFIFOSET(fd,2);
     }
-    return 0;
+    return;
 }
 
 //--------------------------------------------
@@ -3586,7 +3570,7 @@ int lan_ip_check (unsigned char *p)
 //----------------------------------------------------------------------------------------
 // Default packet parsing (normal players or administation/char-server connexion requests)
 //----------------------------------------------------------------------------------------
-int parse_login (int fd)
+void parse_login (int fd)
 {
     struct mmo_account account;
     int  result, i, j;
@@ -3600,7 +3584,7 @@ int parse_login (int fd)
     {
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     while (RFIFOREST (fd) >= 2)
@@ -3631,20 +3615,20 @@ int parse_login (int fd)
         {
             case 0x200:        // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
                 if (RFIFOREST (fd) < 26)
-                    return 0;
+                    return;
                 RFIFOSKIP (fd, 26);
                 break;
 
             case 0x204:        // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
                 if (RFIFOREST (fd) < 18)
-                    return 0;
+                    return;
                 RFIFOSKIP (fd, 18);
                 break;
 
             case 0x64:         // Ask connection of a client
             case 0x01dd:       // Ask connection of a client (encryption mode)
                 if (RFIFOREST (fd) < ((RFIFOW (fd, 0) == 0x64) ? 55 : 47))
-                    return 0;
+                    return;
 
                 account.userid = RFIFOP (fd, 6);
                 account.userid[23] = '\0';
@@ -3867,15 +3851,16 @@ int parse_login (int fd)
                     printf
                         ("login: abnormal request of MD5 key (already opened session).\n");
                     session[fd]->eof = 1;
-                    return 0;
+                    return;
                 }
-                ld = session[fd]->session_data = calloc (sizeof (*ld), 1);
+                CREATE (ld, struct login_session_data, 1);
+                session[fd]->session_data = ld;
                 if (!ld)
                 {
                     printf
                         ("login: Request for md5 key: memory allocation failure (malloc)!\n");
                     session[fd]->eof = 1;
-                    return 0;
+                    return;
                 }
                 if (RFIFOW (fd, 0) == 0x01db)
                 {
@@ -3904,7 +3889,7 @@ int parse_login (int fd)
 
             case 0x2710:       // Connection request of a char-server
                 if (RFIFOREST (fd) < 86)
-                    return 0;
+                    return;
                 {
                     int  GM_value, len;
                     unsigned char *server_name;
@@ -3930,7 +3915,7 @@ int parse_login (int fd)
                     {
                         // If this is the main server, and we don't already have a main server
                         if (server_fd[0] <= 0
-                            && strcmpi (server_name, main_server) == 0)
+                            && strcasecmp (server_name, main_server) == 0)
                         {
                             account.account_id = 0;
                         }
@@ -4006,7 +3991,7 @@ int parse_login (int fd)
                     }
                 }
                 RFIFOSKIP (fd, 86);
-                return 0;
+                return;
 
             case 0x7530:       // Request of the server version
                 login_log ("Sending of the server version (ip: %s)" RETCODE,
@@ -4024,12 +4009,12 @@ int parse_login (int fd)
             case 0x7532:       // Request to end connection
                 login_log ("End of connection (ip: %s)" RETCODE, ip);
                 session[fd]->eof = 1;
-                return 0;
+                return;
 
             case 0x7918:       // Request for administation login
                 if (RFIFOREST (fd) < 4
                     || RFIFOREST (fd) < ((RFIFOW (fd, 2) == 0) ? 28 : 20))
-                    return 0;
+                    return;
                 WFIFOW (fd, 0) = 0x7919;
                 WFIFOB (fd, 2) = 1;
                 if (!check_ladminip
@@ -4087,7 +4072,7 @@ int parse_login (int fd)
                                 strncpy (md5str, admin_pass, sizeof (admin_pass));  // 24
                                 strcat (md5str, ld->md5key);    // 20
                             }
-                            MD5_String2binary (md5str, md5bin);
+                            MD5_to_bin(MD5_from_cstring(md5str), md5bin);
                             // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file
                             if ((admin_state == 1)
                                 && (memcmp (md5bin, RFIFOP (fd, 4), 16) == 0))
@@ -4173,10 +4158,10 @@ int parse_login (int fd)
                 login_log ("End of connection, unknown packet (ip: %s)"
                            RETCODE, ip);
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
     }
-    return 0;
+    return;
 }
 
 //-------------------------------------------------
@@ -4185,12 +4170,12 @@ int parse_login (int fd)
 //-------------------------------------------------
 int config_switch (const char *str)
 {
-    if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
-        || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
-        || strcmpi (str, "si") == 0)
+    if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+        || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+        || strcasecmp (str, "si") == 0)
         return 1;
-    if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
-        || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+    if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+        || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
         return 0;
 
     return atoi (str);
@@ -4238,7 +4223,7 @@ int login_lan_config_read (const char *lancfgName)
 
         remove_control_chars (w1);
         remove_control_chars (w2);
-        if (strcmpi (w1, "lan_char_ip") == 0)
+        if (strcasecmp (w1, "lan_char_ip") == 0)
         {                       // Read Char-Server Lan IP Address
             h = gethostbyname (w2);
             if (h != NULL)
@@ -4256,7 +4241,7 @@ int login_lan_config_read (const char *lancfgName)
             }
             printf ("LAN IP of char-server: %s.\n", lan_char_ip);
         }
-        else if (strcmpi (w1, "subnet") == 0)
+        else if (strcasecmp (w1, "subnet") == 0)
         {                       // Read Subnetwork
             for (j = 0; j < 4; j++)
                 subneti[j] = 0;
@@ -4274,7 +4259,7 @@ int login_lan_config_read (const char *lancfgName)
             printf ("Sub-network of the char-server: %d.%d.%d.%d.\n",
                     subneti[0], subneti[1], subneti[2], subneti[3]);
         }
-        else if (strcmpi (w1, "subnetmask") == 0)
+        else if (strcasecmp (w1, "subnetmask") == 0)
         {                       // Read Subnetwork Mask
             for (j = 0; j < 4; j++)
                 subnetmaski[j] = 255;
@@ -4357,18 +4342,18 @@ int login_config_read (const char *cfgName)
             remove_control_chars (w1);
             remove_control_chars (w2);
 
-            if (strcmpi (w1, "admin_state") == 0)
+            if (strcasecmp (w1, "admin_state") == 0)
             {
                 admin_state = config_switch (w2);
             }
-            else if (strcmpi (w1, "admin_pass") == 0)
+            else if (strcasecmp (w1, "admin_pass") == 0)
             {
                 strncpy (admin_pass, w2, sizeof (admin_pass));
                 admin_pass[sizeof (admin_pass) - 1] = '\0';
             }
-            else if (strcmpi (w1, "ladminallowip") == 0)
+            else if (strcasecmp (w1, "ladminallowip") == 0)
             {
-                if (strcmpi (w2, "clear") == 0)
+                if (strcasecmp (w2, "clear") == 0)
                 {
                     if (access_ladmin_allow)
                         free (access_ladmin_allow);
@@ -4377,27 +4362,23 @@ int login_config_read (const char *cfgName)
                 }
                 else
                 {
-                    if (strcmpi (w2, "all") == 0)
+                    if (strcasecmp (w2, "all") == 0)
                     {
                         // reset all previous values
                         if (access_ladmin_allow)
                             free (access_ladmin_allow);
                         // set to all
-                        access_ladmin_allow = calloc (ACO_STRSIZE, 1);
+                        CREATE (access_ladmin_allow, char, ACO_STRSIZE);
                         access_ladmin_allownum = 1;
-                        access_ladmin_allow[0] = '\0';
                     }
                     else if (w2[0]
                              && !(access_ladmin_allownum == 1
                                   && access_ladmin_allow[0] == '\0'))
                     {           // don't add IP if already 'all'
                         if (access_ladmin_allow)
-                            access_ladmin_allow =
-                                realloc (access_ladmin_allow,
-                                         (access_ladmin_allownum +
-                                          1) * ACO_STRSIZE);
+                            RECREATE (access_ladmin_allow, char, (access_ladmin_allownum + 1) * ACO_STRSIZE);
                         else
-                            access_ladmin_allow = calloc (ACO_STRSIZE, 1);
+                            CREATE (access_ladmin_allow, char, ACO_STRSIZE);
                         strncpy (access_ladmin_allow +
                                  (access_ladmin_allownum++) * ACO_STRSIZE, w2,
                                  ACO_STRSIZE);
@@ -4406,44 +4387,44 @@ int login_config_read (const char *cfgName)
                     }
                 }
             }
-            else if (strcmpi (w1, "gm_pass") == 0)
+            else if (strcasecmp (w1, "gm_pass") == 0)
             {
                 strncpy (gm_pass, w2, sizeof (gm_pass));
                 gm_pass[sizeof (gm_pass) - 1] = '\0';
             }
-            else if (strcmpi (w1, "level_new_gm") == 0)
+            else if (strcasecmp (w1, "level_new_gm") == 0)
             {
                 level_new_gm = atoi (w2);
             }
-            else if (strcmpi (w1, "new_account") == 0)
+            else if (strcasecmp (w1, "new_account") == 0)
             {
                 new_account_flag = config_switch (w2);
             }
-            else if (strcmpi (w1, "login_port") == 0)
+            else if (strcasecmp (w1, "login_port") == 0)
             {
                 login_port = atoi (w2);
             }
-            else if (strcmpi (w1, "account_filename") == 0)
+            else if (strcasecmp (w1, "account_filename") == 0)
             {
                 strncpy (account_filename, w2, sizeof (account_filename));
                 account_filename[sizeof (account_filename) - 1] = '\0';
             }
-            else if (strcmpi (w1, "gm_account_filename") == 0)
+            else if (strcasecmp (w1, "gm_account_filename") == 0)
             {
                 strncpy (GM_account_filename, w2,
                          sizeof (GM_account_filename));
                 GM_account_filename[sizeof (GM_account_filename) - 1] = '\0';
             }
-            else if (strcmpi (w1, "gm_account_filename_check_timer") == 0)
+            else if (strcasecmp (w1, "gm_account_filename_check_timer") == 0)
             {
                 gm_account_filename_check_timer = atoi (w2);
             }
-            else if (strcmpi (w1, "login_log_filename") == 0)
+            else if (strcasecmp (w1, "login_log_filename") == 0)
             {
                 strncpy (login_log_filename, w2, sizeof (login_log_filename));
                 login_log_filename[sizeof (login_log_filename) - 1] = '\0';
             }
-            else if (strcmpi (w1, "login_log_unknown_packets_filename") == 0)
+            else if (strcasecmp (w1, "login_log_unknown_packets_filename") == 0)
             {
                 strncpy (login_log_unknown_packets_filename, w2,
                          sizeof (login_log_unknown_packets_filename));
@@ -4451,23 +4432,23 @@ int login_config_read (const char *cfgName)
                                                    (login_log_unknown_packets_filename)
                                                    - 1] = '\0';
             }
-            else if (strcmpi (w1, "save_unknown_packets") == 0)
+            else if (strcasecmp (w1, "save_unknown_packets") == 0)
             {
                 save_unknown_packets = config_switch (w2);
             }
-            else if (strcmpi (w1, "display_parse_login") == 0)
+            else if (strcasecmp (w1, "display_parse_login") == 0)
             {
                 display_parse_login = config_switch (w2);   // 0: no, 1: yes
             }
-            else if (strcmpi (w1, "display_parse_admin") == 0)
+            else if (strcasecmp (w1, "display_parse_admin") == 0)
             {
                 display_parse_admin = config_switch (w2);   // 0: no, 1: yes
             }
-            else if (strcmpi (w1, "display_parse_fromchar") == 0)
+            else if (strcasecmp (w1, "display_parse_fromchar") == 0)
             {
                 display_parse_fromchar = config_switch (w2);    // 0: no, 1: yes (without packet 0x2714), 2: all packets
             }
-            else if (strcmpi (w1, "date_format") == 0)
+            else if (strcasecmp (w1, "date_format") == 0)
             {                   // note: never have more than 19 char for the date!
                 switch (atoi (w2))
                 {
@@ -4485,38 +4466,38 @@ int login_config_read (const char *cfgName)
                         break;
                 }
             }
-            else if (strcmpi (w1, "min_level_to_connect") == 0)
+            else if (strcasecmp (w1, "min_level_to_connect") == 0)
             {
                 min_level_to_connect = atoi (w2);
             }
-            else if (strcmpi (w1, "add_to_unlimited_account") == 0)
+            else if (strcasecmp (w1, "add_to_unlimited_account") == 0)
             {
                 add_to_unlimited_account = config_switch (w2);
             }
-            else if (strcmpi (w1, "start_limited_time") == 0)
+            else if (strcasecmp (w1, "start_limited_time") == 0)
             {
                 start_limited_time = atoi (w2);
             }
-            else if (strcmpi (w1, "check_ip_flag") == 0)
+            else if (strcasecmp (w1, "check_ip_flag") == 0)
             {
                 check_ip_flag = config_switch (w2);
             }
-            else if (strcmpi (w1, "order") == 0)
+            else if (strcasecmp (w1, "order") == 0)
             {
                 access_order = atoi (w2);
-                if (strcmpi (w2, "deny,allow") == 0 ||
-                    strcmpi (w2, "deny, allow") == 0)
+                if (strcasecmp (w2, "deny,allow") == 0 ||
+                    strcasecmp (w2, "deny, allow") == 0)
                     access_order = ACO_DENY_ALLOW;
-                if (strcmpi (w2, "allow,deny") == 0 ||
-                    strcmpi (w2, "allow, deny") == 0)
+                if (strcasecmp (w2, "allow,deny") == 0 ||
+                    strcasecmp (w2, "allow, deny") == 0)
                     access_order = ACO_ALLOW_DENY;
-                if (strcmpi (w2, "mutual-failture") == 0 ||
-                    strcmpi (w2, "mutual-failure") == 0)
+                if (strcasecmp (w2, "mutual-failture") == 0 ||
+                    strcasecmp (w2, "mutual-failure") == 0)
                     access_order = ACO_MUTUAL_FAILTURE;
             }
-            else if (strcmpi (w1, "allow") == 0)
+            else if (strcasecmp (w1, "allow") == 0)
             {
-                if (strcmpi (w2, "clear") == 0)
+                if (strcasecmp (w2, "clear") == 0)
                 {
                     if (access_allow)
                         free (access_allow);
@@ -4525,26 +4506,23 @@ int login_config_read (const char *cfgName)
                 }
                 else
                 {
-                    if (strcmpi (w2, "all") == 0)
+                    if (strcasecmp (w2, "all") == 0)
                     {
                         // reset all previous values
                         if (access_allow)
                             free (access_allow);
                         // set to all
-                        access_allow = calloc (ACO_STRSIZE, 1);
+                        CREATE (access_allow, char, ACO_STRSIZE);
                         access_allownum = 1;
-                        access_allow[0] = '\0';
                     }
                     else if (w2[0]
                              && !(access_allownum == 1
                                   && access_allow[0] == '\0'))
                     {           // don't add IP if already 'all'
                         if (access_allow)
-                            access_allow =
-                                realloc (access_allow,
-                                         (access_allownum + 1) * ACO_STRSIZE);
+                            RECREATE (access_allow, char, (access_allownum + 1) * ACO_STRSIZE);
                         else
-                            access_allow = calloc (ACO_STRSIZE, 1);
+                            CREATE (access_allow, char, ACO_STRSIZE);
                         strncpy (access_allow +
                                  (access_allownum++) * ACO_STRSIZE, w2,
                                  ACO_STRSIZE);
@@ -4553,9 +4531,9 @@ int login_config_read (const char *cfgName)
                     }
                 }
             }
-            else if (strcmpi (w1, "deny") == 0)
+            else if (strcasecmp (w1, "deny") == 0)
             {
-                if (strcmpi (w2, "clear") == 0)
+                if (strcasecmp (w2, "clear") == 0)
                 {
                     if (access_deny)
                         free (access_deny);
@@ -4564,26 +4542,23 @@ int login_config_read (const char *cfgName)
                 }
                 else
                 {
-                    if (strcmpi (w2, "all") == 0)
+                    if (strcasecmp (w2, "all") == 0)
                     {
                         // reset all previous values
                         if (access_deny)
                             free (access_deny);
                         // set to all
-                        access_deny = calloc (ACO_STRSIZE, 1);
+                        CREATE (access_deny, char, ACO_STRSIZE);
                         access_denynum = 1;
-                        access_deny[0] = '\0';
                     }
                     else if (w2[0]
                              && !(access_denynum == 1
                                   && access_deny[0] == '\0'))
                     {           // don't add IP if already 'all'
                         if (access_deny)
-                            access_deny =
-                                realloc (access_deny,
-                                         (access_denynum + 1) * ACO_STRSIZE);
+                            RECREATE (access_deny, char, (access_denynum + 1) * ACO_STRSIZE);
                         else
-                            access_deny = calloc (ACO_STRSIZE, 1);
+                            CREATE (access_deny, char, ACO_STRSIZE);
                         strncpy (access_deny +
                                  (access_denynum++) * ACO_STRSIZE, w2,
                                  ACO_STRSIZE);
@@ -4591,26 +4566,26 @@ int login_config_read (const char *cfgName)
                     }
                 }
             }
-            else if (strcmpi (w1, "anti_freeze_enable") == 0)
+            else if (strcasecmp (w1, "anti_freeze_enable") == 0)
             {
                 anti_freeze_enable = config_switch (w2);
             }
-            else if (strcmpi (w1, "anti_freeze_interval") == 0)
+            else if (strcasecmp (w1, "anti_freeze_interval") == 0)
             {
                 ANTI_FREEZE_INTERVAL = atoi (w2);
                 if (ANTI_FREEZE_INTERVAL < 5)
                     ANTI_FREEZE_INTERVAL = 5;   // minimum 5 seconds
             }
-            else if (strcmpi (w1, "import") == 0)
+            else if (strcasecmp (w1, "import") == 0)
             {
                 login_config_read (w2);
             }
-            else if (strcmpi (w1, "update_host") == 0)
+            else if (strcasecmp (w1, "update_host") == 0)
             {
                 strncpy (update_host, w2, sizeof (update_host));
                 update_host[sizeof (update_host) - 1] = '\0';
             }
-            else if (strcmpi (w1, "main_server") == 0)
+            else if (strcasecmp (w1, "main_server") == 0)
             {
                 strncpy (main_server, w2, sizeof (main_server));
                 main_server[sizeof (main_server) - 1] = '\0';
@@ -5079,19 +5054,18 @@ int do_init (int argc, char **argv)
 
     read_gm_account ();
     mmo_auth_init ();
-    set_termfunc (mmo_auth_sync);
+//     set_termfunc (mmo_auth_sync);
     set_defaultparse (parse_login);
     login_fd = make_listen_port (login_port);
 
-    add_timer_func_list (check_auth_sync, "check_auth_sync");
+//    add_timer_func_list (check_auth_sync, "check_auth_sync");
 
     // Trigger auth sync every 5 minutes
     i = add_timer_interval (gettick () + 300000, check_auth_sync, 0, 0, 300000);
 
     if (anti_freeze_enable > 0)
     {
-        add_timer_func_list (char_anti_freeze_system,
-                             "char_anti_freeze_system");
+//        add_timer_func_list (char_anti_freeze_system, "char_anti_freeze_system");
         i = add_timer_interval (gettick () + 1000, char_anti_freeze_system, 0,
                                 0, ANTI_FREEZE_INTERVAL * 1000);
     }
@@ -5100,7 +5074,7 @@ int do_init (int argc, char **argv)
     j = gm_account_filename_check_timer;
     if (j == 0)                 // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists)
         j = 60;
-    add_timer_func_list (check_GM_file, "check_GM_file");
+//    add_timer_func_list (check_GM_file, "check_GM_file");
     i = add_timer_interval (gettick () + j * 1000, check_GM_file, 0, 0, j * 1000);  // every x sec we check if gm file has been changed
 
     login_log
diff --git a/src/map/Makefile b/src/map/Makefile
index f31279c..d340015 100644
--- a/src/map/Makefile
+++ b/src/map/Makefile
@@ -5,8 +5,8 @@ all: map
 obj:
 	mkdir obj
 
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/mt_rand.o ../common/md5calc.o
-LDLIBS = -lz -lm
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/mt_rand.o ../common/md5calc.o
+LDLIBS = -lm
 
 map: obj/tmw.o obj/magic-interpreter-lexer.o obj/magic-interpreter-parser.o obj/magic-interpreter-base.o obj/magic-expr.o obj/magic-stmt.o obj/magic.o obj/map.o obj/chrif.o obj/clif.o obj/pc.o obj/npc.o obj/chat.o obj/path.o obj/itemdb.o obj/mob.o obj/script.o obj/storage.o obj/skill.o obj/skill-pools.o obj/atcommand.o obj/battle.o obj/intif.o obj/trade.o obj/party.o obj/guild.o $(COMMON_OBJ)
 	${LINK.c} $^ ${LDLIBS} -o $@
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index cb9e93c..6a09970 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -13,6 +13,7 @@
 #include "../common/socket.h"
 #include "../common/timer.h"
 #include "../common/nullpo.h"
+#include "../common/mt_rand.h"
 
 #include "atcommand.h"
 #include "battle.h"
@@ -794,7 +795,7 @@ AtCommandType atcommand (const int level, const char *message,
 
         while (atcommand_info[i].type != AtCommand_Unknown)
         {
-            if (strcmpi (command + 1, atcommand_info[i].command + 1) == 0
+            if (strcasecmp (command + 1, atcommand_info[i].command + 1) == 0
                 && level >= atcommand_info[i].level)
             {
                 p[0] = atcommand_info[i].command[0];    // set correct first symbol for after.
@@ -862,7 +863,7 @@ int msg_config_read (const char *cfgName)
             continue;
         if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
         {
-            if (strcmpi (w1, "import") == 0)
+            if (strcasecmp (w1, "import") == 0)
             {
                 msg_config_read (w2);
             }
@@ -891,7 +892,7 @@ static AtCommandInfo *get_atcommandinfo_byname (const char *name)
     int  i;
 
     for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
-        if (strcmpi (atcommand_info[i].command + 1, name) == 0)
+        if (strcasecmp (atcommand_info[i].command + 1, name) == 0)
             return &atcommand_info[i];
 
     return NULL;
@@ -930,9 +931,9 @@ int atcommand_config_read (const char *cfgName)
                 p->level = 0;
         }
 
-        if (strcmpi (w1, "import") == 0)
+        if (strcasecmp (w1, "import") == 0)
             atcommand_config_read (w2);
-        else if (strcmpi (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' &&   // symbol of standard ragnarok GM commands
+        else if (strcasecmp (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' &&   // symbol of standard ragnarok GM commands
                  w2[0] != '%')  // symbol of party chat speaking
             command_symbol = w2[0];
     }
@@ -3506,7 +3507,7 @@ int atcommand_param (const int fd, struct map_session_data *sd,
     index = -1;
     for (i = 0; param[i] != NULL; i++)
     {
-        if (strcmpi (command, param[i]) == 0)
+        if (strcasecmp (command, param[i]) == 0)
         {
             index = i;
             break;
@@ -7131,12 +7132,12 @@ int atcommand_email (const int fd, struct map_session_data *sd,
         clif_displaymessage (fd, msg_table[145]);   // Invalid new email. Please enter a real e-mail.
         return -1;
     }
-    else if (strcmpi (new_email, "a@a.com") == 0)
+    else if (strcasecmp (new_email, "a@a.com") == 0)
     {
         clif_displaymessage (fd, msg_table[146]);   // New email must be a real e-mail.
         return -1;
     }
-    else if (strcmpi (actual_email, new_email) == 0)
+    else if (strcasecmp (actual_email, new_email) == 0)
     {
         clif_displaymessage (fd, msg_table[147]);   // New email must be different of the actual e-mail.
         return -1;
@@ -7829,7 +7830,7 @@ atcommand_dropall (const int fd, struct map_session_data *sd,
 
 /*==========================================
  * @chardropall by [MouseJstr]
- * 
+ *
  * Throw all the characters possessions on the ground.  Normally
  * done in response to them being disrespectful of a GM
  *------------------------------------------
@@ -7967,8 +7968,8 @@ atcommand_skillid (const int fd, struct map_session_data *sd,
     skillen = strlen (message);
     while (skill_names[idx].id != 0)
     {
-        if ((strnicmp (skill_names[idx].name, message, skillen) == 0) ||
-            (strnicmp (skill_names[idx].desc, message, skillen) == 0))
+        if ((strncasecmp (skill_names[idx].name, message, skillen) == 0) ||
+            (strncasecmp (skill_names[idx].desc, message, skillen) == 0))
         {
             char output[255];
             sprintf (output, "skill %d: %s", skill_names[idx].id,
@@ -8116,7 +8117,7 @@ atcommand_leaves (const int fd, struct map_session_data *sd,
 }
 
 /*==========================================
- * 
+ *
  *------------------------------------------
  */
 int atcommand_summon (const int fd, struct map_session_data *sd,
@@ -8182,7 +8183,7 @@ atcommand_adjcmdlvl (const int fd, struct map_session_data *sd,
     }
 
     for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
-        if (strcmpi (cmd, atcommand_info[i].command + 1) == 0)
+        if (strcasecmp (cmd, atcommand_info[i].command + 1) == 0)
         {
             atcommand_info[i].level = newlev;
             clif_displaymessage (fd, "@command level changed.");
@@ -8230,7 +8231,7 @@ atcommand_adjgmlvl (const int fd, struct map_session_data *sd,
  *
  * Open a trade window with a remote player
  *
- * If I have to jump to a remote player one more time, I am 
+ * If I have to jump to a remote player one more time, I am
  * gonna scream!
  *------------------------------------------
  */
diff --git a/src/map/battle.c b/src/map/battle.c
index c9e341d..a6a803a 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -8,7 +8,6 @@
 
 #include "../common/timer.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 
 #include "clif.h"
 #include "guild.h"
@@ -1423,22 +1422,19 @@ struct battle_delay_damage_
     int  damage;
     int  flag;
 };
-int battle_delay_damage_sub (int tid, unsigned int tick, int id, int data)
+void battle_delay_damage_sub (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct battle_delay_damage_ *dat = (struct battle_delay_damage_ *) data;
     if (dat && map_id2bl (id) == dat->src && dat->target->prev != NULL)
         battle_damage (dat->src, dat->target, dat->damage, dat->flag);
     free (dat);
-    return 0;
 }
 
 int battle_delay_damage (unsigned int tick, struct block_list *src,
                          struct block_list *target, int damage, int flag)
 {
-    struct battle_delay_damage_ *dat =
-        (struct battle_delay_damage_ *) aCalloc (1,
-                                                 sizeof (struct
-                                                         battle_delay_damage_));
+    struct battle_delay_damage_ *dat;
+    CREATE (dat, struct battle_delay_damage_, 1);
 
     nullpo_retr (0, src);
     nullpo_retr (0, target);
@@ -5432,12 +5428,12 @@ int battle_check_range (struct block_list *src, struct block_list *bl,
  */
 int battle_config_switch (const char *str)
 {
-    if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
-        || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
-        || strcmpi (str, "si") == 0)
+    if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+        || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+        || strcasecmp (str, "si") == 0)
         return 1;
-    if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
-        || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+    if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+        || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
         return 0;
     return atoi (str);
 }
@@ -6118,10 +6114,10 @@ int battle_config_read (const char *cfgName)
         if (sscanf (line, "%[^:]:%s", w1, w2) != 2)
             continue;
         for (i = 0; i < sizeof (data) / (sizeof (data[0])); i++)
-            if (strcmpi (w1, data[i].str) == 0)
+            if (strcasecmp (w1, data[i].str) == 0)
                 *data[i].val = battle_config_switch (w2);
 
-        if (strcmpi (w1, "import") == 0)
+        if (strcasecmp (w1, "import") == 0)
             battle_config_read (w2);
     }
     fclose_ (fp);
@@ -6276,8 +6272,6 @@ int battle_config_read (const char *cfgName)
         if ((battle_config.packet_ver_flag & 63) == 0)  // added by [Yor]
             battle_config.packet_ver_flag = 63; // accept all clients
 
-        add_timer_func_list (battle_delay_damage_sub,
-                             "battle_delay_damage_sub");
     }
 
     return 0;
diff --git a/src/map/chat.c b/src/map/chat.c
index 0163eed..00aadea 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -5,7 +5,6 @@
 
 #include "../common/db.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 #include "map.h"
 #include "clif.h"
 #include "pc.h"
@@ -29,7 +28,7 @@ int chat_createchat (struct map_session_data *sd, int limit, int pub,
 
     nullpo_retr (0, sd);
 
-    cd = aCalloc (1, sizeof (struct chat_data));
+    cd = calloc (1, sizeof (struct chat_data));
 
     cd->limit = limit;
     cd->pub = pub;
@@ -280,7 +279,7 @@ int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger,
 
     nullpo_retr (1, nd);
 
-    cd = aCalloc (1, sizeof (struct chat_data));
+    cd = calloc (1, sizeof (struct chat_data));
 
     cd->limit = cd->trigger = limit;
     if (trigger > 0)
diff --git a/src/map/chrif.c b/src/map/chrif.c
index 8bbeb59..b80b4fd 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1121,7 +1121,7 @@ void ladmin_itemfrob (int fd)
  *
  *------------------------------------------
  */
-int chrif_parse (int fd)
+void chrif_parse (int fd)
 {
     int  packet_len, cmd;
 
@@ -1138,7 +1138,7 @@ int chrif_parse (int fd)
         }
         close (fd);
         delete_session (fd);
-        return 0;
+        return;
     }
 
     while (RFIFOREST (fd) >= 2)
@@ -1156,20 +1156,20 @@ int chrif_parse (int fd)
             if (r == 1)
                 continue;       // intifで処理した
             if (r == 2)
-                return 0;       // intifで処理したが、データが足りない
+                return;       // intifで処理したが、データが足りない
 
             session[fd]->eof = 1;
-            return 0;
+            return;
         }
         packet_len = packet_len_table[cmd - 0x2af8];
         if (packet_len == -1)
         {
             if (RFIFOREST (fd) < 4)
-                return 0;
+                return;
             packet_len = RFIFOW (fd, 2);
         }
         if (RFIFOREST (fd) < packet_len)
-            return 0;
+            return;
 
         switch (cmd)
         {
@@ -1235,12 +1235,10 @@ int chrif_parse (int fd)
                     printf ("chrif_parse : unknown packet %d %d\n", fd,
                             RFIFOW (fd, 0));
                 session[fd]->eof = 1;
-                return 0;
+                return;
         }
         RFIFOSKIP (fd, packet_len);
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -1248,13 +1246,13 @@ int chrif_parse (int fd)
  * 今このmap鯖に繋がっているクライアント人数をchar鯖へ送る
  *------------------------------------------
  */
-int send_users_tochar (int tid, unsigned int tick, int id, int data)
+void send_users_tochar (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  users = 0, i;
     struct map_session_data *sd;
 
     if (char_fd <= 0 || session[char_fd] == NULL)
-        return 0;
+        return;
 
     WFIFOW (char_fd, 0) = 0x2aff;
     for (i = 0; i < fd_max; i++)
@@ -1271,8 +1269,6 @@ int send_users_tochar (int tid, unsigned int tick, int id, int data)
     WFIFOW (char_fd, 2) = 6 + 4 * users;
     WFIFOW (char_fd, 4) = users;
     WFIFOSET (char_fd, 6 + 4 * users);
-
-    return 0;
 }
 
 /*==========================================
@@ -1280,21 +1276,19 @@ int send_users_tochar (int tid, unsigned int tick, int id, int data)
  * char鯖との接続を確認し、もし切れていたら再度接続する
  *------------------------------------------
  */
-int check_connect_char_server (int tid, unsigned int tick, int id, int data)
+void check_connect_char_server (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     if (char_fd <= 0 || session[char_fd] == NULL)
     {
         printf ("Attempt to connect to char-server...\n");
         chrif_state = 0;
         if ((char_fd = make_connection (char_ip, char_port)) < 0)
-            return 0;
+            return;
         session[char_fd]->func_parse = chrif_parse;
         realloc_fifo (char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
 
         chrif_connect (char_fd);
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -1303,9 +1297,8 @@ int check_connect_char_server (int tid, unsigned int tick, int id, int data)
  */
 int do_init_chrif (void)
 {
-    add_timer_func_list (check_connect_char_server,
-                         "check_connect_char_server");
-    add_timer_func_list (send_users_tochar, "send_users_tochar");
+//    add_timer_func_list (check_connect_char_server, "check_connect_char_server");
+//    add_timer_func_list (send_users_tochar, "send_users_tochar");
     add_timer_interval (gettick () + 1000, check_connect_char_server, 0, 0,
                         10 * 1000);
     add_timer_interval (gettick () + 1000, send_users_tochar, 0, 0, 5 * 1000);
diff --git a/src/map/clif.c b/src/map/clif.c
index d630815..8bbf112 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -20,10 +20,10 @@
 
 #include "../common/socket.h"
 #include "../common/timer.h"
-#include "../common/malloc.h"
 #include "../common/version.h"
 #include "../common/nullpo.h"
 #include "../common/md5calc.h"
+#include "../common/mt_rand.h"
 
 #include "atcommand.h"
 #include "battle.h"
@@ -755,15 +755,13 @@ int clif_clearchar (struct block_list *bl, int type)
     return 0;
 }
 
-static int clif_clearchar_delay_sub (int tid, unsigned int tick, int id,
-                                     int data)
+static void clif_clearchar_delay_sub (timer_id tid, tick_t tick, custom_id_t id,
+                                     custom_data_t data)
 {
     struct block_list *bl = (struct block_list *) id;
 
     clif_clearchar (bl, data);
     map_freeblock (bl);
-
-    return 0;
 }
 
 int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
@@ -775,7 +773,7 @@ int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
         exit (1);
     }
     memcpy (tmpbl, bl, sizeof (struct block_list));
-    add_timer (tick, clif_clearchar_delay_sub, (int) tmpbl, type);
+    add_timer (tick, clif_clearchar_delay_sub, (custom_id_t) tmpbl, type);
 
     return 0;
 }
@@ -1513,12 +1511,10 @@ void clif_quitsave (int fd, struct map_session_data *sd)
  *
  *------------------------------------------
  */
-static int clif_waitclose (int tid, unsigned int tick, int id, int data)
+static void clif_waitclose (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     if (session[id])
         session[id]->eof = 1;
-
-    return 0;
 }
 
 /*==========================================
@@ -5653,7 +5649,7 @@ int clif_combo_delay (struct block_list *bl, int wait)
  *白刃取り
  *------------------------------------------
  */
-int clif_bladestop (struct block_list *src, struct block_list *dst, int bool)
+int clif_bladestop (struct block_list *src, struct block_list *dst, int boolean)
 {
     unsigned char buf[32];
 
@@ -5663,7 +5659,7 @@ int clif_bladestop (struct block_list *src, struct block_list *dst, int bool)
     WBUFW (buf, 0) = 0x1d1;
     WBUFL (buf, 2) = src->id;
     WBUFL (buf, 6) = dst->id;
-    WBUFL (buf, 10) = bool;
+    WBUFL (buf, 10) = boolean;
 
     clif_send (buf, packet_len_table[0x1d1], src, AREA);
 
@@ -8582,7 +8578,7 @@ void clif_parse_PartyMessage (int fd, struct map_session_data *sd)
         clif_displaymessage (fd, msg_txt (505));
         return;
     }
-    
+
     if (is_atcommand (fd, sd, message, 0) != AtCommand_None
             || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 //バーサーク時は会話も不可
                                 || sd->sc_data[SC_NOCHAT].timer != -1))) //チャット禁止
@@ -9907,7 +9903,7 @@ func_table clif_parse_func_table[0x220] =
 // *INDENT-ON*
 
 // Checks for packet flooding
-int clif_check_packet_flood(fd, cmd)
+int clif_check_packet_flood(int fd, int cmd)
 {
     struct map_session_data *sd = session[fd]->session_data;
     unsigned int rate, tick = gettick();
@@ -10025,7 +10021,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
     fd = sd->fd;
     msg_len = RFIFOW (fd, 2) - 4;
     name_len = strlen (sd->status.name);
-    /* 
+    /*
      * At least one character is required in all instances.
      * Notes for length checks:
      *
@@ -10063,9 +10059,9 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
     p = (char *) (type != 1) ? RFIFOP (fd, 4) : RFIFOP (fd, 28);
     buf_len = (type == 1) ? msg_len - min_len: msg_len;
 
-    /* 
+    /*
      * The client attempted to exceed the maximum message length.
-     * 
+     *
      * The conf suggests up to chat_maxline characters, after which the message
      * is truncated. But the previous behavior was to drop the message, so
      * we'll do that, too.
@@ -10079,7 +10075,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
     /* We're leaving an extra eight bytes for public/global chat, 1 for NUL. */
     buf_len += (type == 2) ? 8 + 1 : 1;
 
-    buf = (char *) aMalloc (buf_len);
+    buf = (char *) malloc (buf_len);
     memcpy ((type != 2) ? buf : buf + 8, p,
             (type != 2) ? buf_len - 1 : buf_len - 8 - 1);
     buf[buf_len - 1] = '\0';
@@ -10118,7 +10114,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
  * socket.cのdo_parsepacketから呼び出される
  *------------------------------------------
  */
-static int clif_parse (int fd)
+static void clif_parse (int fd)
 {
     int  packet_len = 0, cmd = 0;
     struct map_session_data *sd = NULL;
@@ -10158,11 +10154,11 @@ static int clif_parse (int fd)
             close (fd);
         if (fd)
             delete_session (fd);
-        return 0;
+        return;
     }
 
     if (RFIFOREST (fd) < 2)
-        return 0;               // Too small (no packet number)
+        return;               // Too small (no packet number)
 
     cmd = RFIFOW (fd, 0);
 
@@ -10187,10 +10183,10 @@ static int clif_parse (int fd)
                 session[fd]->eof = 1;
                 break;
         }
-        return 0;
+        return;
     }
     else if (cmd >= 0x200)
-        return 0;
+        return;
 
     // パケット長を計算
     packet_len = packet_len_table[cmd];
@@ -10198,19 +10194,19 @@ static int clif_parse (int fd)
     {
         if (RFIFOREST (fd) < 4)
         {
-            return 0;           // Runt packet (variable length without a length sent)
+            return;           // Runt packet (variable length without a length sent)
         }
         packet_len = RFIFOW (fd, 2);
         if (packet_len < 4 || packet_len > 32768)
         {
             session[fd]->eof = 1;
-            return 0;           // Runt packet (variable out of bounds)
+            return;           // Runt packet (variable out of bounds)
         }
     }
 
     if (RFIFOREST (fd) < packet_len)
     {
-        return 0;               // Runt packet (sent legnth is too small)
+        return;               // Runt packet (sent legnth is too small)
     }
 
     if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1)
@@ -10223,7 +10219,7 @@ static int clif_parse (int fd)
         {
             // Flood triggered. Skip packet.
             RFIFOSKIP(sd->fd, packet_len);
-            return 0;
+            return;
         }
 
         clif_parse_func_table[cmd].func (fd, sd);
@@ -10267,7 +10263,7 @@ static int clif_parse (int fd)
                 {
                     printf ("clif.c: cant write [%s] !!! data is lost !!!\n",
                             packet_txt);
-                    return 1;
+                    return;
                 }
                 else
                 {
@@ -10306,8 +10302,6 @@ static int clif_parse (int fd)
         }
     }
     RFIFOSKIP (fd, packet_len);
-
-    return 0;
 }
 
 /*==========================================
@@ -10335,9 +10329,5 @@ int do_init_clif (void)
         exit (1);
     }
 
-    add_timer_func_list (clif_waitclose, "clif_waitclose");
-    add_timer_func_list (clif_clearchar_delay_sub,
-                         "clif_clearchar_delay_sub");
-
     return 0;
 }
diff --git a/src/map/clif.h b/src/map/clif.h
index a7da92d..d947f95 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -177,7 +177,7 @@ int  clif_devotion (struct map_session_data *sd, int target);
 int  clif_spiritball (struct map_session_data *sd);
 int  clif_combo_delay (struct block_list *src, int wait);
 int  clif_bladestop (struct block_list *src, struct block_list *dst,
-                     int bool);
+                     int boolean);
 int  clif_changemapcell (int m, int x, int y, int cell_type, int type);
 
 int  clif_status_change (struct block_list *bl, int type, int flag);
diff --git a/src/map/guild.c b/src/map/guild.c
index 4a7552a..6017b8e 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -9,7 +9,6 @@
 #include "../common/timer.h"
 #include "../common/socket.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 #include "battle.h"
 #include "npc.h"
 #include "pc.h"
@@ -72,8 +71,8 @@ int guild_checkskill (struct guild *g, int id)
     return g->skill[id - 10000].lv;
 }
 
-int  guild_payexp_timer (int tid, unsigned int tick, int id, int data);
-int  guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data);
+void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
+void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
 
 static int guild_read_castledb (void)
 {
@@ -94,8 +93,7 @@ static int guild_read_castledb (void)
         if (line[0] == '/' && line[1] == '/')
             continue;
         memset (str, 0, sizeof (str));
-        gc = (struct guild_castle *) aCalloc (1,
-                                              sizeof (struct guild_castle));
+        CREATE (gc, struct guild_castle, 1);
         for (j = 0, p = line; j < 6 && p; j++)
         {
             str[j] = p;
@@ -157,9 +155,6 @@ void do_init_guild (void)
 
     guild_read_castledb ();
 
-    add_timer_func_list (guild_gvg_eliminate_timer,
-                         "guild_gvg_eliminate_timer");
-    add_timer_func_list (guild_payexp_timer, "guild_payexp_timer");
     add_timer_interval (gettick () + GUILD_PAYEXP_INVERVAL,
                         guild_payexp_timer, 0, 0, GUILD_PAYEXP_INVERVAL);
 }
@@ -170,15 +165,14 @@ struct guild *guild_search (int guild_id)
     return numdb_search (guild_db, guild_id);
 }
 
-int guild_searchname_sub (void *key, void *data, va_list ap)
+void guild_searchname_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = (struct guild *) data, **dst;
     char *str;
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct guild **);
-    if (strcmpi (g->name, str) == 0)
+    if (strcasecmp (g->name, str) == 0)
         *dst = g;
-    return 0;
 }
 
 // ギルド名検索
@@ -282,22 +276,22 @@ int guild_check_conflict (struct map_session_data *sd)
 }
 
 // ギルドのEXPキャッシュをinter鯖にフラッシュする
-int guild_payexp_timer_sub (void *key, void *data, va_list ap)
+void guild_payexp_timer_sub (db_key_t key, db_val_t data, va_list ap)
 {
-    int  i, *dellist, *delp, dataid = (int) key;
+    int  i, *dellist, *delp, dataid = key.i;
     struct guild_expcache *c;
     struct guild *g;
 
-    nullpo_retr (0, ap);
-    nullpo_retr (0, c = (struct guild_expcache *) data);
-    nullpo_retr (0, dellist = va_arg (ap, int *));
-    nullpo_retr (0, delp = va_arg (ap, int *));
+    nullpo_retv (ap);
+    nullpo_retv (c = (struct guild_expcache *) data);
+    nullpo_retv (dellist = va_arg (ap, int *));
+    nullpo_retv (delp = va_arg (ap, int *));
 
     if (*delp >= GUILD_PAYEXP_LIST
         || (g = guild_search (c->guild_id)) == NULL)
-        return 0;
+        return;
     if ((i = guild_getindex (g, c->account_id, 0 /*c->char_id*/)) < 0)
-        return 0;
+        return;
 
     g->member[i].exp += c->exp;
     intif_guild_change_memberinfo (g->guild_id, c->account_id, 0 /*char_id*/,
@@ -307,10 +301,9 @@ int guild_payexp_timer_sub (void *key, void *data, va_list ap)
 
     dellist[(*delp)++] = dataid;
     free (c);
-    return 0;
 }
 
-int guild_payexp_timer (int tid, unsigned int tick, int id, int data)
+void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  dellist[GUILD_PAYEXP_LIST], delp = 0, i;
     numdb_foreach (guild_expcache_db, guild_payexp_timer_sub, dellist, &delp);
@@ -318,7 +311,6 @@ int guild_payexp_timer (int tid, unsigned int tick, int id, int data)
         numdb_erase (guild_expcache_db, dellist[i]);
 //  if(battle_config.etc_log)
 //      printf("guild exp %d charactor's exp flushed !\n",delp);
-    return 0;
 }
 
 //------------------------------------------------------------------------
@@ -424,7 +416,7 @@ int guild_npc_request_info (int guild_id, const char *event)
     if (event == NULL || *event == 0)
         return guild_request_info (guild_id);
 
-    ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist));
+    CREATE (ev, struct eventlist, 1);
     memcpy (ev->name, event, sizeof (ev->name));
     ev->next =
         (struct eventlist *) numdb_search (guild_infoevent_db, guild_id);
@@ -494,7 +486,7 @@ int guild_recv_info (struct guild *sg)
 
     if ((g = numdb_search (guild_db, sg->guild_id)) == NULL)
     {
-        g = (struct guild *) aCalloc (1, sizeof (struct guild));
+        CREATE (g, struct guild, 1);
         numdb_insert (guild_db, sg->guild_id, g);
         before = *sg;
 
@@ -1094,9 +1086,7 @@ int guild_payexp (struct map_session_data *sd, int exp)
 
     if ((c = numdb_search (guild_expcache_db, sd->status.account_id /*char_id*/)) == NULL)
     {
-        c = (struct guild_expcache *) aCalloc (1,
-                                               sizeof (struct
-                                                       guild_expcache));
+        CREATE (c, struct guild_expcache, 1);
         c->guild_id = sd->status.guild_id;
         c->account_id = sd->status.account_id;
         c->char_id = 0;
@@ -1452,14 +1442,14 @@ int guild_allianceack (int guild_id1, int guild_id2, int account_id1,
 }
 
 // ギルド解散通知用
-int guild_broken_sub (void *key, void *data, va_list ap)
+void guild_broken_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = (struct guild *) data;
     int  guild_id = va_arg (ap, int);
     int  i, j;
     struct map_session_data *sd = NULL;
 
-    nullpo_retr (0, g);
+    nullpo_retv (g);
 
     for (i = 0; i < MAX_GUILDALLIANCE; i++)
     {                           // 関係を破棄
@@ -1472,7 +1462,6 @@ int guild_broken_sub (void *key, void *data, va_list ap)
             g->alliance[i].guild_id = 0;
         }
     }
-    return 0;
 }
 
 // ギルド解散通知
@@ -1548,7 +1537,7 @@ int guild_addcastleinfoevent (int castle_id, int index, const char *name)
     if (name == NULL || *name == 0)
         return 0;
 
-    ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist));
+    CREATE (ev, struct eventlist, 1);
     memcpy (ev->name, name, sizeof (ev->name));
     ev->next = numdb_search (guild_castleinfoevent_db, code);
     numdb_insert (guild_castleinfoevent_db, code, ev);
@@ -1812,19 +1801,19 @@ int guild_agit_end (void)
     return 0;
 }
 
-int guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data)
+void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {                               // Run One NPC_Event[OnAgitEliminate]
     size_t len = strlen ((const char *) data);
-    char *evname = (char *) aCalloc (len + 4, sizeof (char));
+    char *evname;
+    CREATE (evname, char, len + 4);
     int  c = 0;
 
     if (!agit_flag)
-        return 0;               // Agit already End
+        return;               // Agit already End
     memcpy (evname, (const char *) data, len - 5);
     strcpy (evname + len - 5, "Eliminate");
     c = npc_event_do (evname);
     printf ("NPC_Event:[%s] Run (%d) Events.\n", evname, c);
-    return 0;
 }
 
 int guild_agit_break (struct mob_data *md)
@@ -1833,7 +1822,7 @@ int guild_agit_break (struct mob_data *md)
 
     nullpo_retr (0, md);
 
-    evname = (char *) aCalloc (strlen (md->npc_event) + 1, sizeof (char));
+    CREATE (evname, char, strlen (md->npc_event) + 1);
 
     strcpy (evname, md->npc_event);
 // Now By User to Run [OnAgitBreak] NPC Event...
@@ -1891,40 +1880,32 @@ int guild_isallied (struct guild *g, struct guild_castle *gc)
     return 0;
 }
 
-static int guild_db_final (void *key, void *data, va_list ap)
+static void guild_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild *g = data;
 
     free (g);
-
-    return 0;
 }
 
-static int castle_db_final (void *key, void *data, va_list ap)
+static void castle_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild_castle *gc = data;
 
     free (gc);
-
-    return 0;
 }
 
-static int guild_expcache_db_final (void *key, void *data, va_list ap)
+static void guild_expcache_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild_expcache *c = data;
 
     free (c);
-
-    return 0;
 }
 
-static int guild_infoevent_db_final (void *key, void *data, va_list ap)
+static void guild_infoevent_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct eventlist *ev = data;
 
     free (ev);
-
-    return 0;
 }
 
 void do_final_guild (void)
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index dfa3d36..6557d43 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -6,13 +6,13 @@
 #include "../common/db.h"
 #include "../common/grfio.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 #include "map.h"
 #include "battle.h"
 #include "itemdb.h"
 #include "script.h"
 #include "pc.h"
 #include "../common/socket.h"
+#include "../common/mt_rand.h"
 
 #ifdef MEMWATCH
 #include "memwatch.h"
@@ -49,17 +49,16 @@ void itemdb_reload (void);
  *------------------------------------------
  */
 // name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
-int itemdb_searchname_sub (void *key, void *data, va_list ap)
+void itemdb_searchname_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct item_data *item = (struct item_data *) data, **dst;
     char *str;
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct item_data **);
-//  if( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 ||
+//  if( strcasecmp(item->name,str)==0 || strcmp(item->jname,str)==0 ||
 //      memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
-    if (strcmpi (item->name, str) == 0) //by lupus
+    if (strcasecmp (item->name, str) == 0) //by lupus
         *dst = item;
-    return 0;
 }
 
 /*==========================================
@@ -72,7 +71,7 @@ int itemdb_searchjname_sub (void *key, void *data, va_list ap)
     char *str;
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct item_data **);
-    if (strcmpi (item->jname, str) == 0)
+    if (strcasecmp (item->jname, str) == 0)
         *dst = item;
     return 0;
 }
@@ -159,7 +158,7 @@ struct item_data *itemdb_search (int nameid)
     if (id)
         return id;
 
-    id = (struct item_data *) aCalloc (1, sizeof (struct item_data));
+    id = (struct item_data *) calloc (1, sizeof (struct item_data));
     numdb_insert (item_db, nameid, id);
 
     id->nameid = nameid;
@@ -264,10 +263,9 @@ static int itemdb_read_itemslottable (void)
     char *buf, *p;
     int  s;
 
-    buf = grfio_read ("data\\itemslottable.txt");
+    buf = grfio_reads ("data\\itemslottable.txt", &s);
     if (buf == NULL)
         return -1;
-    s = grfio_size ("data\\itemslottable.txt");
     buf[s] = 0;
     for (p = buf; p - buf < s;)
     {
@@ -674,28 +672,26 @@ static int itemdb_read_noequip (void)
  *
  *------------------------------------------
  */
-static int itemdb_final (void *key, void *data, va_list ap)
+static void itemdb_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct item_data *id;
 
-    nullpo_retr (0, id = data);
+    nullpo_retv (id = data);
 
     if (id->use_script)
         free (id->use_script);
     if (id->equip_script)
         free (id->equip_script);
     free (id);
-
-    return 0;
 }
 
 void itemdb_reload (void)
 {
     /*
-     * 
+     *
      * <empty item databases>
      * itemdb_read();
-     * 
+     *
      */
 
     do_init_itemdb ();
diff --git a/src/map/magic-expr.c b/src/map/magic-expr.c
index 18c293d..c3846e2 100644
--- a/src/map/magic-expr.c
+++ b/src/map/magic-expr.c
@@ -3,6 +3,8 @@
 #include "itemdb.h"
 #include <math.h>
 
+#include "../common/mt_rand.h"
+
 #define IS_SOLID(c) ((c) == 1 || (c) == 5)
 
 int map_is_solid (int m, int x, int y)
@@ -180,7 +182,8 @@ static void intify (val_t * v)
 
 area_t *area_new (int ty)
 {
-    area_t *retval = (area_t *) aCalloc (sizeof (area_t), 1);
+    area_t *retval;
+    CREATE (retval, area_t, 1);
     retval->ty = ty;
     return retval;
 }
diff --git a/src/map/magic-interpreter-base.c b/src/map/magic-interpreter-base.c
index 9d21832..671f962 100644
--- a/src/map/magic-interpreter-base.c
+++ b/src/map/magic-interpreter-base.c
@@ -143,8 +143,9 @@ teleport_anchor_t *magic_find_anchor (char *name)
 
 static env_t *alloc_env (magic_conf_t * conf)
 {
-    env_t *env = (env_t *) aCalloc (sizeof (env_t), 1);
-    env->vars = (val_t *) aCalloc (sizeof (val_t), conf->vars_nr);
+    env_t *env;
+    CREATE (env, env_t, 1);
+    CREATE (env->vars, val_t, conf->vars_nr);
     env->base_env = conf;
     return env;
 }
@@ -295,7 +296,7 @@ spellguard_can_satisfy (spellguard_check_t * check, character_t * caster,
 /*
         fprintf(stderr, "MC(%d/%s)? %d%d%d%d (%u <= %u)\n",
                 caster->bl.id, caster->status.name,
-                retval, 
+                retval,
                 caster->cast_tick <= tick,
                 check->mana <= caster->status.sp,
                 check_prerequisites(caster, check->components),
@@ -456,8 +457,8 @@ void spell_update_location (invocation_t * invocation)
 
 invocation_t *spell_instantiate (effect_set_t * effect_set, env_t * env)
 {
-    invocation_t *retval =
-        (invocation_t *) aCalloc (sizeof (invocation_t), 1);
+    invocation_t *retval;
+    CREATE (retval, invocation_t, 1);
     entity_t *caster;
 
     retval->env = env;
diff --git a/src/map/magic-interpreter-parser.y b/src/map/magic-interpreter-parser.y
index 8484902..c5ee41d 100644
--- a/src/map/magic-interpreter-parser.y
+++ b/src/map/magic-interpreter-parser.y
@@ -224,13 +224,13 @@ semicolons		: /* empty */
 
 
 proc_formals_list	: /* empty  */
-                          { $$ = aCalloc(sizeof(proc_t), 1); }
+                          { CREATE ($$, proc_t, 1); }
 			| proc_formals_list_ne
                           { $$ = $1; }
 			;
 
 proc_formals_list_ne	: ID
-                          { $$ = aCalloc(sizeof(proc_t), 1);
+                          { CREATE ($$, proc_t, 1);
                             $$->args_nr = 1;
                             $$->args = malloc(sizeof(int));
                             $$->args[0] = intern_id($1);
@@ -414,7 +414,7 @@ arg_list		: /* empty */
 
 
 arg_list_ne		: expr
-				{ $$.args = aCalloc(sizeof(expr_t *), 1);
+				{ CREATE($$.args, expr_t *, 1);
                                   $$.args_nr = 1;
                                   $$.args[0] = $1;
                                 }
@@ -452,7 +452,7 @@ area			: location
 spelldef		: spellbody_list
                                 {  $$ = new_spell($1); }
 			| LET defs IN spellbody_list
-                                {  $$ = new_spell($4); 
+                                {  $$ = new_spell($4);
                                    $$->letdefs_nr = $2.letdefs_nr;
                                    $$->letdefs = $2.letdefs;
                                    $$->spellguard = $4;
@@ -693,7 +693,7 @@ effect_list		: /* empty */
 			| effect semicolons effect_list
                         	{ $$ = set_effect_continuation($1, $3); }
 			;
-			
+
 
 %%
 
@@ -743,7 +743,7 @@ add_spell(spell_t *spell, int line_nr)
         magic_conf.spells = realloc(magic_conf.spells, magic_conf.spells_nr * sizeof (spell_t*));
         magic_conf.spells[index] = spell;
 
-            
+
 }
 
 static void
@@ -867,7 +867,7 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
                 spellguard_implication(a->next, b);
         else
                 a->next = b;
-                
+
 
         return retval;
 }
diff --git a/src/map/magic-interpreter.h b/src/map/magic-interpreter.h
index 006c8fb..e9232bd 100644
--- a/src/map/magic-interpreter.h
+++ b/src/map/magic-interpreter.h
@@ -8,7 +8,6 @@
 #include <string.h>
 #include <math.h>
 
-#include "../common/malloc.h"
 #include "../common/nullpo.h"
 
 #include "battle.h"
diff --git a/src/map/magic-stmt.c b/src/map/magic-stmt.c
index b9833d6..4ae7e5d 100644
--- a/src/map/magic-stmt.c
+++ b/src/map/magic-stmt.c
@@ -64,8 +64,8 @@ static void clear_activation_record (cont_activation_record_t * ar)
     }
 }
 
-static int
-invocation_timer_callback (int _, unsigned int __, int id, int data)
+static void
+invocation_timer_callback (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
 {
     invocation_t *invocation = (invocation_t *) map_id2bl (id);
 
@@ -74,7 +74,6 @@ invocation_timer_callback (int _, unsigned int __, int id, int data)
         invocation->timer = 0;
         spell_execute (invocation);
     }
-    return 0;
 }
 
 static void clear_stack (invocation_t * invocation)
@@ -224,12 +223,11 @@ static void char_update (character_t * character)
                  character->bl.y);
 }
 
-static int timer_callback_effect (int _, unsigned int __, int id, int data)
+static void timer_callback_effect (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
 {
     entity_t *target = map_id2bl (id);
     if (target)
         clif_misceffect (target, data);
-    return 0;
 }
 
 static void entity_effect (entity_t * entity, int effect_nr, int delay)
@@ -247,14 +245,12 @@ void magic_unshroud (character_t * other_char)
 //        entity_effect(&other_char->bl, MAGIC_EFFECT_REVEAL);
 }
 
-static int
-timer_callback_effect_npc_delete (int timer_id, unsigned int odelay,
-                                  int npc_id, int _)
+static void
+timer_callback_effect_npc_delete (timer_id UNUSED, tick_t odelay,
+                                  custom_id_t npc_id, custom_data_t UNUSED)
 {
     struct npc_data *effect_npc = (struct npc_data *) map_id2bl (npc_id);
     npc_free (effect_npc);
-
-    return 0;
 }
 
 static struct npc_data *local_spell_effect (int m, int x, int y, int effect,
@@ -370,15 +366,13 @@ static int op_message (env_t * env, int args_nr, val_t * args)
     return 0;
 }
 
-static int
-timer_callback_kill_npc (int timer_id, unsigned int odelay, int npc_id,
-                         int data)
+static void
+timer_callback_kill_npc (timer_id UNUSED, tick_t odelay, custom_id_t npc_id,
+                         custom_data_t data)
 {
     struct npc_data *npc = (struct npc_data *) map_id2bl (npc_id);
     if (npc)
         npc_free (npc);
-
-    return 0;
 }
 
 static int op_messenger_npc (env_t * env, int args_nr, val_t * args)
@@ -420,8 +414,8 @@ static void entity_warp (entity_t * target, int destm, int destx, int desty)
                 // Warp part #1: update relevant data, interrupt trading etc.:
                 pc_setpos (character, map_name, character->bl.x, character->bl.y, 0);
                 // Warp part #2: now notify the client
-                clif_changemap (character, map_name, 
-                                character->bl.x, character->bl.y); 
+                clif_changemap (character, map_name,
+                                character->bl.x, character->bl.y);
                 break;
             }
             case BL_MOB:
@@ -1252,7 +1246,8 @@ static effect_t *run_call (invocation_t * invocation,
     cont_activation_record_t *ar;
     int  args_nr = current->e.e_call.args_nr;
     int *formals = current->e.e_call.formals;
-    val_t *old_actuals = aCalloc (sizeof (val_t), args_nr);
+    val_t *old_actuals;
+    CREATE (old_actuals, val_t, args_nr);
     int  i;
 
     ar = add_stack_entry (invocation, CONT_STACK_PROC, return_location);
diff --git a/src/map/map.c b/src/map/map.c
index e1adcef..8261e49 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -13,8 +13,7 @@
 #include "../common/timer.h"
 #include "../common/db.h"
 #include "../common/grfio.h"
-#include "../common/malloc.h"
-
+#include "../common/mt_rand.h"
 #include "map.h"
 #include "chrif.h"
 #include "clif.h"
@@ -785,7 +784,7 @@ void map_foreachobject (int (*func) (struct block_list *, va_list), int type,
  * map.h内で#defineしてある
  *------------------------------------------
  */
-int map_clearflooritem_timer (int tid, unsigned int tick, int id, int data)
+void map_clearflooritem_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct flooritem_data *fitem = NULL;
 
@@ -795,14 +794,12 @@ int map_clearflooritem_timer (int tid, unsigned int tick, int id, int data)
     {
         if (battle_config.error_log)
             printf ("map_clearflooritem_timer : error\n");
-        return 1;
+        return;
     }
     if (data)
         delete_timer (fitem->cleartimer, map_clearflooritem_timer);
     clif_clearflooritem (fitem, 0);
     map_delobject (fitem->bl.id, BL_ITEM);
-
-    return 0;
 }
 
 /*==========================================
@@ -876,7 +873,7 @@ int map_addflooritem_any (struct item *item_data, int amount, int m, int x,
         return 0;
     r = mt_random ();
 
-    fitem = (struct flooritem_data *) aCalloc (1, sizeof (*fitem));
+    CREATE (fitem, struct flooritem_data, 1);
     fitem->bl.type = BL_ITEM;
     fitem->bl.prev = fitem->bl.next = NULL;
     fitem->bl.m = m;
@@ -1030,7 +1027,7 @@ void map_addchariddb (int charid, char *name)
     p = numdb_search (charid_db, charid);
     if (p == NULL)
     {                           // データベースにない
-        p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick));
+        CREATE (p, struct charid2nick, 1);
         p->req_id = 0;
     }
     else
@@ -1061,7 +1058,7 @@ int map_reqchariddb (struct map_session_data *sd, int charid)
     p = numdb_search (charid_db, charid);
     if (p != NULL)              // データベースにすでにある
         return 0;
-    p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick));
+    CREATE (p, struct charid2nick, 1);
     p->req_id = sd->bl.id;
     numdb_insert (charid_db, charid, p);
     return 0;
@@ -1302,7 +1299,7 @@ struct map_session_data *map_nick2sd (char *nick)
             && pl_sd->state.auth)
         {
             // Without case sensitive check (increase the number of similar character names found)
-            if (strnicmp (pl_sd->status.name, nick, nicklen) == 0)
+            if (strncasecmp (pl_sd->status.name, nick, nicklen) == 0)
             {
                 // Strict comparison (if found, we finish the function immediatly with correct value)
                 if (strcmp (pl_sd->status.name, nick) == 0)
@@ -1341,7 +1338,7 @@ struct block_list *map_id2bl (int id)
  * id_db内の全てにfuncを実行
  *------------------------------------------
  */
-int map_foreachiddb (int (*func) (void *, void *, va_list), ...)
+int map_foreachiddb (db_func_t func, ...)
 {
     va_list ap = NULL;
 
@@ -1573,10 +1570,7 @@ int map_setipport (char *name, unsigned long ip, int port)
     md = strdb_search (map_db, name);
     if (md == NULL)
     {                           // not exist -> add new data
-        mdos =
-            (struct map_data_other_server *) aCalloc (1,
-                                                      sizeof (struct
-                                                              map_data_other_server));
+        CREATE (mdos, struct map_data_other_server, 1);
         memcpy (mdos->name, name, 24);
         mdos->gat = NULL;
         mdos->ip = ip;
@@ -1609,7 +1603,7 @@ int map_setipport (char *name, unsigned long ip, int port)
  * 水場高さ設定
  *------------------------------------------
  */
-static struct
+static struct Waterlist
 {
     char mapname[24];
     int  waterheight;
@@ -1642,7 +1636,9 @@ static void map_readwater (char *watertxt)
         return;
     }
     if (waterlist == NULL)
-        waterlist = aCalloc (MAX_MAP_PER_SERVER, sizeof (*waterlist));
+    {
+        CREATE (waterlist, struct Waterlist, MAX_MAP_PER_SERVER);
+    }
     while (fgets (line, 1020, fp) && n < MAX_MAP_PER_SERVER)
     {
         int  wh, count;
@@ -1777,7 +1773,8 @@ int map_readallmap (void)
         if (strstr (map[i].name, ".gat") == NULL)
             continue;
         sprintf (fn, "data\\%s", map[i].name);
-        if (grfio_size (fn) == -1)
+        // TODO - remove this, it is the last call to grfio_size, which is deprecated
+        if (!grfio_size (fn))
         {
             map_delmap (map[i].name);
             maps_removed++;
@@ -1825,7 +1822,7 @@ int map_readallmap (void)
  */
 int map_addmap (char *mapname)
 {
-    if (strcmpi (mapname, "clear") == 0)
+    if (strcasecmp (mapname, "clear") == 0)
     {
         map_num = 0;
         return 0;
@@ -1849,7 +1846,7 @@ int map_delmap (char *mapname)
 {
     int  i;
 
-    if (strcmpi (mapname, "all") == 0)
+    if (strcasecmp (mapname, "all") == 0)
     {
         map_num = 0;
         return 0;
@@ -1959,15 +1956,15 @@ int map_config_read (char *cfgName)
             continue;
         if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
         {
-            if (strcmpi (w1, "userid") == 0)
+            if (strcasecmp (w1, "userid") == 0)
             {
                 chrif_setuserid (w2);
             }
-            else if (strcmpi (w1, "passwd") == 0)
+            else if (strcasecmp (w1, "passwd") == 0)
             {
                 chrif_setpasswd (w2);
             }
-            else if (strcmpi (w1, "char_ip") == 0)
+            else if (strcasecmp (w1, "char_ip") == 0)
             {
                 h = gethostbyname (w2);
                 if (h != NULL)
@@ -1985,11 +1982,11 @@ int map_config_read (char *cfgName)
                 }
                 chrif_setip (w2);
             }
-            else if (strcmpi (w1, "char_port") == 0)
+            else if (strcasecmp (w1, "char_port") == 0)
             {
                 chrif_setport (atoi (w2));
             }
-            else if (strcmpi (w1, "map_ip") == 0)
+            else if (strcasecmp (w1, "map_ip") == 0)
             {
                 h = gethostbyname (w2);
                 if (h != NULL)
@@ -2006,70 +2003,58 @@ int map_config_read (char *cfgName)
                 }
                 clif_setip (w2);
             }
-            else if (strcmpi (w1, "map_port") == 0)
+            else if (strcasecmp (w1, "map_port") == 0)
             {
                 clif_setport (atoi (w2));
                 map_port = (atoi (w2));
             }
-            else if (strcmpi (w1, "water_height") == 0)
+            else if (strcasecmp (w1, "water_height") == 0)
             {
                 map_readwater (w2);
             }
-            else if (strcmpi (w1, "map") == 0)
+            else if (strcasecmp (w1, "map") == 0)
             {
                 map_addmap (w2);
             }
-            else if (strcmpi (w1, "delmap") == 0)
+            else if (strcasecmp (w1, "delmap") == 0)
             {
                 map_delmap (w2);
             }
-            else if (strcmpi (w1, "npc") == 0)
+            else if (strcasecmp (w1, "npc") == 0)
             {
                 npc_addsrcfile (w2);
             }
-            else if (strcmpi (w1, "delnpc") == 0)
+            else if (strcasecmp (w1, "delnpc") == 0)
             {
                 npc_delsrcfile (w2);
             }
-            else if (strcmpi (w1, "data_grf") == 0)
-            {
-                grfio_setdatafile (w2);
-            }
-            else if (strcmpi (w1, "sdata_grf") == 0)
-            {
-                grfio_setsdatafile (w2);
-            }
-            else if (strcmpi (w1, "adata_grf") == 0)
-            {
-                grfio_setadatafile (w2);
-            }
-            else if (strcmpi (w1, "autosave_time") == 0)
+            else if (strcasecmp (w1, "autosave_time") == 0)
             {
                 autosave_interval = atoi (w2) * 1000;
                 if (autosave_interval <= 0)
                     autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
             }
-            else if (strcmpi (w1, "motd_txt") == 0)
+            else if (strcasecmp (w1, "motd_txt") == 0)
             {
                 strcpy (motd_txt, w2);
             }
-            else if (strcmpi (w1, "help_txt") == 0)
+            else if (strcasecmp (w1, "help_txt") == 0)
             {
                 strcpy (help_txt, w2);
             }
-            else if (strcmpi (w1, "mapreg_txt") == 0)
+            else if (strcasecmp (w1, "mapreg_txt") == 0)
             {
                 strcpy (mapreg_txt, w2);
             }
-            else if (strcmpi (w1, "gm_log") == 0)
+            else if (strcasecmp (w1, "gm_log") == 0)
             {
                 gm_logfile_name = strdup (w2);
             }
-            else if (strcmpi (w1, "log_file") == 0)
+            else if (strcasecmp (w1, "log_file") == 0)
             {
                 map_set_logfile (w2);
             }
-            else if (strcmpi (w1, "import") == 0)
+            else if (strcasecmp (w1, "import") == 0)
             {
                 map_config_read (w2);
             }
@@ -2080,26 +2065,6 @@ int map_config_read (char *cfgName)
     return 0;
 }
 
-int id_db_final (void *k, void *d, va_list ap)
-{
-    return 0;
-}
-
-int map_db_final (void *k, void *d, va_list ap)
-{
-    return 0;
-}
-
-int nick_db_final (void *k, void *d, va_list ap)
-{
-    return 0;
-}
-
-int charid_db_final (void *k, void *d, va_list ap)
-{
-    return 0;
-}
-
 static int cleanup_sub (struct block_list *bl, va_list ap)
 {
     nullpo_retr (0, bl);
@@ -2150,10 +2115,10 @@ void do_final (void)
     map_removenpc ();
     timer_final ();
 
-    numdb_final (id_db, id_db_final);
-    strdb_final (map_db, map_db_final);
-    strdb_final (nick_db, nick_db_final);
-    numdb_final (charid_db, charid_db_final);
+    numdb_final (id_db, NULL);
+    strdb_final (map_db, NULL);
+    strdb_final (nick_db, NULL);
+    numdb_final (charid_db, NULL);
 
     for (i = 0; i <= map_num; i++)
     {
@@ -2190,6 +2155,10 @@ int compare_item (struct item *a, struct item *b)
             (a->card[2] == b->card[2]) && (a->card[3] == b->card[3]));
 }
 
+// TODO move shutdown stuff here
+void term_func (void)
+{
+}
 /*======================================================
  * Map-Server Init and Command-line Arguments [Valaris]
  *------------------------------------------------------
@@ -2203,7 +2172,6 @@ int do_init (int argc, char *argv[])
     unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
     unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
     unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf";
-    unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt";
 
     for (i = 1; i < argc; i++)
     {
@@ -2221,8 +2189,6 @@ int do_init (int argc, char *argv[])
             SCRIPT_CONF_NAME = argv[i + 1];
         else if (strcmp (argv[i], "--msg_config") == 0)
             MSG_CONF_NAME = argv[i + 1];
-        else if (strcmp (argv[i], "--grf_path_file") == 0)
-            GRF_PATH_FILENAME = argv[i + 1];
     }
 
     map_config_read (MAP_CONF_NAME);
@@ -2238,12 +2204,9 @@ int do_init (int argc, char *argv[])
     nick_db = strdb_init (24);
     charid_db = numdb_init ();
 
-    grfio_init (GRF_PATH_FILENAME);
-
     map_readallmap ();
 
-    add_timer_func_list (map_clearflooritem_timer,
-                         "map_clearflooritem_timer");
+//    add_timer_func_list (map_clearflooritem_timer, "map_clearflooritem_timer");
 
     do_init_chrif ();
     do_init_clif ();
diff --git a/src/map/map.h b/src/map/map.h
index a558397..5955418 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -8,6 +8,8 @@
 #include <sys/time.h>
 #include <netinet/in.h>
 #include "../common/mmo.h"
+#include "../common/timer.h"
+#include "../common/db.h"
 
 #ifndef MAX
 #  define MAX(x,y) (((x)>(y)) ? (x) : (y))
@@ -762,7 +764,7 @@ void map_write_log (char *format, ...);
 #define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args)
 
 // 床アイテム関連
-int  map_clearflooritem_timer (int, unsigned int, int, int);
+void map_clearflooritem_timer (timer_id, tick_t, custom_id_t, custom_data_t);
 #define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
 int  map_addflooritem_any (struct item *, int amount, int m, int x, int y,
                            struct map_session_data **owners,
@@ -787,7 +789,7 @@ int  map_setipport (char *name, unsigned long ip, int port);
 int  map_eraseipport (char *name, unsigned long ip, int port);
 void map_addiddb (struct block_list *);
 void map_deliddb (struct block_list *bl);
-int  map_foreachiddb (int (*)(void *, void *, va_list), ...);
+int  map_foreachiddb (db_func_t, ...);
 void map_addnickdb (struct map_session_data *);
 int  map_scriptcont (struct map_session_data *sd, int id);  /* Continues a script either on a spell or on an NPC */
 struct map_session_data *map_nick2sd (char *);
diff --git a/src/map/mob.c b/src/map/mob.c
index 99d1cc2..3e3297d 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -9,7 +9,7 @@
 #include "../common/socket.h"
 #include "../common/db.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
 #include "map.h"
 #include "clif.h"
 #include "intif.h"
@@ -43,7 +43,7 @@ struct mob_db mob_db[2001];
  */
 static int distance (int, int, int, int);
 static int mob_makedummymobdb (int);
-static int mob_timer (int, unsigned int, int, int);
+static void mob_timer (timer_id, tick_t, custom_id_t, custom_data_t);
 int  mobskill_use (struct mob_data *md, unsigned int tick, int event);
 int  mobskill_deltimer (struct mob_data *md);
 int  mob_skillid2skillidx (int class, int skillid);
@@ -61,7 +61,7 @@ int mobdb_searchname (const char *str)
 
     for (i = 0; i < sizeof (mob_db) / sizeof (mob_db[0]); i++)
     {
-        if (strcmpi (mob_db[i].name, str) == 0
+        if (strcasecmp (mob_db[i].name, str) == 0
             || strcmp (mob_db[i].jname, str) == 0
             || memcmp (mob_db[i].name, str, 24) == 0
             || memcmp (mob_db[i].jname, str, 24) == 0)
@@ -188,7 +188,7 @@ static void mob_mutate (struct mob_data *md, int stat, int intensity)   // inten
 {
     int  old_stat;
     int  new_stat;
-    int  real_intensity;        // relative intensity 
+    int  real_intensity;        // relative intensity
     const int mut_base = mutation_base[stat];
     int  sign = 1;
 
@@ -399,11 +399,10 @@ int mob_once_spawn (struct map_session_data *sd, char *mapname,
 
     for (count = 0; count < amount; count++)
     {
-        md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
-        memset (md, '\0', sizeof *md);
+        md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
         if (mob_db[class].mode & 0x02)
             md->lootitem =
-                (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+                (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
         else
             md->lootitem = NULL;
 
@@ -1035,33 +1034,33 @@ int mob_changestate (struct mob_data *md, int state, int type)
  * It branches to a walk and an attack.
  *------------------------------------------
  */
-static int mob_timer (int tid, unsigned int tick, int id, int data)
+static void mob_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct mob_data *md;
     struct block_list *bl;
 
     if ((bl = map_id2bl (id)) == NULL)
     {                           //攻撃してきた敵がもういないのは正常のようだ
-        return 1;
+        return;
     }
 
     if (!bl || !bl->type || bl->type != BL_MOB)
-        return 1;
+        return;
 
-    nullpo_retr (1, md = (struct mob_data *) bl);
+    nullpo_retv (md = (struct mob_data *) bl);
 
     if (!md->bl.type || md->bl.type != BL_MOB)
-        return 1;
+        return;
 
     if (md->timer != tid)
     {
         if (battle_config.error_log == 1)
             printf ("mob_timer %d != %d\n", md->timer, tid);
-        return 0;
+        return;
     }
     md->timer = -1;
     if (md->bl.prev == NULL || md->state.state == MS_DEAD)
-        return 1;
+        return;
 
     map_freeblock_lock ();
     switch (md->state.state)
@@ -1082,7 +1081,7 @@ static int mob_timer (int tid, unsigned int tick, int id, int data)
             break;
     }
     map_freeblock_unlock ();
-    return 0;
+    return;
 }
 
 /*==========================================
@@ -1141,10 +1140,9 @@ int mob_walktoxy (struct mob_data *md, int x, int y, int easy)
  * mob spawn with delay (timer function)
  *------------------------------------------
  */
-static int mob_delayspawn (int tid, unsigned int tick, int m, int n)
+static void mob_delayspawn (timer_id tid, tick_t tick, custom_id_t m, custom_data_t n)
 {
     mob_spawn (m);
-    return 0;
 }
 
 /*==========================================
@@ -2311,44 +2309,42 @@ static int mob_ai_sub_foreachclient (struct map_session_data *sd, va_list ap)
  * Serious processing for mob in PC field of view   (interval timer function)
  *------------------------------------------
  */
-static int mob_ai_hard (int tid, unsigned int tick, int id, int data)
+static void mob_ai_hard (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     clif_foreachclient (mob_ai_sub_foreachclient, tick);
-
-    return 0;
 }
 
 /*==========================================
  * Negligent mode MOB AI (PC is not in near)
  *------------------------------------------
  */
-static int mob_ai_sub_lazy (void *key, void *data, va_list app)
+static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
 {
     struct mob_data *md = data;
     unsigned int tick;
     va_list ap;
 
-    nullpo_retr (0, md);
-    nullpo_retr (0, app);
-    nullpo_retr (0, ap = va_arg (app, va_list));
+    nullpo_retv (md);
+    nullpo_retv (app);
+    nullpo_retv (ap = va_arg (app, va_list));
 
     if (md == NULL)
-        return 0;
+        return;
 
     if (!md->bl.type || md->bl.type != BL_MOB)
-        return 0;
+        return;
 
     tick = va_arg (ap, unsigned int);
 
     if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME * 10)
-        return 0;
+        return;
     md->last_thinktime = tick;
 
     if (md->bl.prev == NULL || md->skilltimer != -1)
     {
         if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME * 10)
             md->next_walktime = tick;
-        return 0;
+        return;
     }
 
     if (DIFF_TICK (md->next_walktime, tick) < 0 &&
@@ -2383,18 +2379,15 @@ static int mob_ai_sub_lazy (void *key, void *data, va_list app)
 
         md->next_walktime = tick + MPRAND (5000, 10000);
     }
-    return 0;
 }
 
 /*==========================================
  * Negligent processing for mob outside PC field of view   (interval timer function)
  *------------------------------------------
  */
-static int mob_ai_lazy (int tid, unsigned int tick, int id, int data)
+static void mob_ai_lazy (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     map_foreachiddb (mob_ai_sub_lazy, tick);
-
-    return 0;
 }
 
 /*==========================================
@@ -2421,13 +2414,13 @@ struct delay_item_drop2
  * item drop with delay (timer function)
  *------------------------------------------
  */
-static int mob_delay_item_drop (int tid, unsigned int tick, int id, int data)
+static void mob_delay_item_drop (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct delay_item_drop *ditem;
     struct item temp_item;
     int  flag;
 
-    nullpo_retr (0, ditem = (struct delay_item_drop *) id);
+    nullpo_retv (ditem = (struct delay_item_drop *) id);
 
     memset (&temp_item, 0, sizeof (temp_item));
     temp_item.nameid = ditem->nameid;
@@ -2446,26 +2439,25 @@ static int mob_delay_item_drop (int tid, unsigned int tick, int id, int data)
                               ditem->third_sd, 0);
         }
         free (ditem);
-        return 0;
+        return;
     }
 
     map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y,
                       ditem->first_sd, ditem->second_sd, ditem->third_sd, 0);
 
     free (ditem);
-    return 0;
 }
 
 /*==========================================
  * item drop (timer function)-lootitem with delay
  *------------------------------------------
  */
-static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
+static void mob_delay_item_drop2 (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct delay_item_drop2 *ditem;
     int  flag;
 
-    nullpo_retr (0, ditem = (struct delay_item_drop2 *) id);
+    nullpo_retv (ditem = (struct delay_item_drop2 *) id);
 
     if (battle_config.item_auto_get == 1)
     {
@@ -2480,7 +2472,7 @@ static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
                               ditem->second_sd, ditem->third_sd, 0);
         }
         free (ditem);
-        return 0;
+        return;
     }
 
     map_addflooritem (&ditem->item_data, ditem->item_data.amount, ditem->m,
@@ -2488,7 +2480,6 @@ static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
                       ditem->third_sd, 0);
 
     free (ditem);
-    return 0;
 }
 
 /*==========================================
@@ -2524,16 +2515,15 @@ int mob_catch_delete (struct mob_data *md, int type)
     return 0;
 }
 
-int mob_timer_delete (int tid, unsigned int tick, int id, int data)
+void mob_timer_delete (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct block_list *bl = map_id2bl (id);
     struct mob_data *md;
 
-    nullpo_retr (0, bl);
+    nullpo_retv (bl);
 
     md = (struct mob_data *) bl;
     mob_catch_delete (md, 3);
-    return 0;
 }
 
 /*==========================================
@@ -3009,10 +2999,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
                 if (drop_rate <= MRAND (10000))
                     continue;
 
-                ditem =
-                    (struct delay_item_drop *) aCalloc (1,
-                                                        sizeof (struct
-                                                                delay_item_drop));
+                ditem = (struct delay_item_drop *)
+                    calloc (1, sizeof (struct delay_item_drop));
                 ditem->nameid = mob_db[md->class].dropitem[i].nameid;
                 ditem->amount = 1;
                 ditem->m = md->bl.m;
@@ -3021,8 +3009,7 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
                 ditem->first_sd = mvp_sd;
                 ditem->second_sd = second_sd;
                 ditem->third_sd = third_sd;
-                add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem,
-                           0);
+                add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem, 0);
             }
             if (sd && sd->state.attack_type == BF_WEAPON)
             {
@@ -3041,10 +3028,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
                         if (sd->monster_drop_itemrate[i] <= MRAND (10000))
                             continue;
 
-                        ditem =
-                            (struct delay_item_drop *) aCalloc (1,
-                                                                sizeof (struct
-                                                                        delay_item_drop));
+                        ditem = (struct delay_item_drop *)
+                            calloc (1, sizeof (struct delay_item_drop));
                         ditem->nameid = sd->monster_drop_itemid[i];
                         ditem->amount = 1;
                         ditem->m = md->bl.m;
@@ -3068,10 +3053,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
                 {
                     struct delay_item_drop2 *ditem;
 
-                    ditem =
-                        (struct delay_item_drop2 *) aCalloc (1,
-                                                             sizeof (struct
-                                                                     delay_item_drop2));
+                    ditem = (struct delay_item_drop2 *)
+                        calloc (1, sizeof (struct delay_item_drop2));
                     memcpy (&ditem->item_data, &md->lootitem[i],
                             sizeof (md->lootitem[0]));
                     ditem->m = md->bl.m;
@@ -3252,8 +3235,8 @@ int mob_class_change (struct mob_data *md, int *value)
     md->skilllv = 0;
 
     if (md->lootitem == NULL && mob_db[class].mode & 0x02)
-        md->lootitem =
-            (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+        md->lootitem = (struct item *)
+            calloc (LOOTITEM_SIZE, sizeof (struct item));
 
     skill_clear_unitgroup (&md->bl);
     skill_cleartimerskill (&md->bl);
@@ -3487,11 +3470,10 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
         for (; amount > 0; amount--)
         {
             int  x = 0, y = 0, c = 0, i = 0;
-            md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
+            md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
             if (mob_db[class].mode & 0x02)
-                md->lootitem =
-                    (struct item *) aCalloc (LOOTITEM_SIZE,
-                                             sizeof (struct item));
+                md->lootitem = (struct item *)
+                    calloc (LOOTITEM_SIZE, sizeof (struct item));
             else
                 md->lootitem = NULL;
 
@@ -3620,7 +3602,7 @@ int mob_skillid2skillidx (int class, int skillid)
  * スキル使用(詠唱完了、ID指定)
  *------------------------------------------
  */
-int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
+void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct mob_data *md = NULL;
     struct block_list *bl;
@@ -3628,16 +3610,16 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
     int  range;
 
     if ((mbl = map_id2bl (id)) == NULL) //詠唱したMobがもういないというのは良くある正常処理
-        return 0;
+        return;
     if ((md = (struct mob_data *) mbl) == NULL)
     {
         printf ("mobskill_castend_id nullpo mbl->id:%d\n", mbl->id);
-        return 0;
+        return;
     }
     if (md->bl.type != BL_MOB || md->bl.prev == NULL)
-        return 0;
+        return;
     if (md->skilltimer != tid)  // タイマIDの確認
-        return 0;
+        return;
 
     md->skilltimer = -1;
     //沈黙や状態異常など
@@ -3646,13 +3628,13 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
         if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
             || md->sc_data[SC_ROKISWEIL].timer != -1
             || md->sc_data[SC_STEELBODY].timer != -1)
-            return 0;
+            return;
         if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER)   //オートカウンター
-            return 0;
+            return;
         if (md->sc_data[SC_BLADESTOP].timer != -1)  //白刃取り
-            return 0;
+            return;
         if (md->sc_data[SC_BERSERK].timer != -1)    //バーサーク
-            return 0;
+            return;
     }
     if (md->skillid != NPC_EMOTION)
         md->last_thinktime = tick + battle_get_adelay (&md->bl);
@@ -3660,10 +3642,10 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
     if ((bl = map_id2bl (md->skilltarget)) == NULL || bl->prev == NULL)
     {                           //スキルターゲットが存在しない
         //printf("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了
-        return 0;
+        return;
     }
     if (md->bl.m != bl->m)
-        return 0;
+        return;
 
     if (md->skillid == PR_LEXAETERNA)
     {
@@ -3672,7 +3654,7 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
             && (sc_data[SC_FREEZE].timer != -1
                 || (sc_data[SC_STONE].timer != -1
                     && sc_data[SC_STONE].val2 == 0)))
-            return 0;
+            return;
     }
     else if (md->skillid == RG_BACKSTAP)
     {
@@ -3680,17 +3662,17 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
             battle_get_dir (bl);
         int  dist = distance (md->bl.x, md->bl.y, bl->x, bl->y);
         if (bl->type != BL_SKILL && (dist == 0 || map_check_dir (dir, t_dir)))
-            return 0;
+            return;
     }
     if (((skill_get_inf (md->skillid) & 1) || (skill_get_inf2 (md->skillid) & 4)) &&    // 彼我敵対関係チェック
         battle_check_target (&md->bl, bl, BCT_ENEMY) <= 0)
-        return 0;
+        return;
     range = skill_get_range (md->skillid, md->skilllv);
     if (range < 0)
         range = battle_get_range (&md->bl) - (range + 1);
     if (range + battle_config.mob_skill_add_range <
         distance (md->bl.x, md->bl.y, bl->x, bl->y))
-        return 0;
+        return;
 
     md->skilldelay[md->skillidx] = tick;
 
@@ -3720,15 +3702,13 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
                                            md->skilllv, tick, 0);
             break;
     }
-
-    return 0;
 }
 
 /*==========================================
  * スキル使用(詠唱完了、場所指定)
  *------------------------------------------
  */
-int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
+void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct mob_data *md = NULL;
     struct block_list *bl;
@@ -3736,15 +3716,15 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
 
     //mobskill_castend_id同様詠唱したMobが詠唱完了時にもういないというのはありそうなのでnullpoから除外
     if ((bl = map_id2bl (id)) == NULL)
-        return 0;
+        return;
 
-    nullpo_retr (0, md = (struct mob_data *) bl);
+    nullpo_retv (md = (struct mob_data *) bl);
 
     if (md->bl.type != BL_MOB || md->bl.prev == NULL)
-        return 0;
+        return;
 
     if (md->skilltimer != tid)  // タイマIDの確認
-        return 0;
+        return;
 
     md->skilltimer = -1;
     if (md->sc_data)
@@ -3752,13 +3732,13 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
         if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
             || md->sc_data[SC_ROKISWEIL].timer != -1
             || md->sc_data[SC_STEELBODY].timer != -1)
-            return 0;
+            return;
         if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER)   //オートカウンター
-            return 0;
+            return;
         if (md->sc_data[SC_BLADESTOP].timer != -1)  //白刃取り
-            return 0;
+            return;
         if (md->sc_data[SC_BERSERK].timer != -1)    //バーサーク
-            return 0;
+            return;
     }
 
     if (battle_config.monster_skill_reiteration == 0)
@@ -3789,7 +3769,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
         {
             if (skill_check_unit_range
                 (md->bl.m, md->skillx, md->skilly, range, md->skillid) > 0)
-                return 0;
+                return;
         }
     }
     if (battle_config.monster_skill_nofootset == 1)
@@ -3819,7 +3799,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
         {
             if (skill_check_unit_range2
                 (md->bl.m, md->skillx, md->skilly, range) > 0)
-                return 0;
+                return;
         }
     }
 
@@ -3836,7 +3816,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
                     c++;
             }
             if (c >= maxcount)
-                return 0;
+                return;
         }
     }
 
@@ -3845,7 +3825,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
         range = battle_get_range (&md->bl) - (range + 1);
     if (range + battle_config.mob_skill_add_range <
         distance (md->bl.x, md->bl.y, md->skillx, md->skilly))
-        return 0;
+        return;
     md->skilldelay[md->skillidx] = tick;
 
     if (battle_config.mob_skill_log == 1)
@@ -3856,7 +3836,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
     skill_castend_pos2 (&md->bl, md->skillx, md->skilly, md->skillid,
                         md->skilllv, tick, 0);
 
-    return 0;
+    return;
 }
 
 /*==========================================
@@ -4292,7 +4272,7 @@ int mobskill_use (struct mob_data *md, unsigned int tick, int event)
                     if (ms[i].target == MST_MASTER)
                     {
                         bl = &md->bl;
-                        if (md->master_id) 
+                        if (md->master_id)
                             bl = map_id2bl (md->master_id);
                     }
                     else
@@ -5048,10 +5028,10 @@ static int mob_readskilldb (void)
 void mob_reload (void)
 {
     /*
-     * 
+     *
      * <empty monster database>
      * mob_read();
-     * 
+     *
      */
 
     do_init_mob ();
@@ -5069,15 +5049,6 @@ int do_init_mob (void)
     mob_read_randommonster ();
     mob_readskilldb ();
 
-    add_timer_func_list (mob_timer, "mob_timer");
-    add_timer_func_list (mob_delayspawn, "mob_delayspawn");
-    add_timer_func_list (mob_delay_item_drop, "mob_delay_item_drop");
-    add_timer_func_list (mob_delay_item_drop2, "mob_delay_item_drop2");
-    add_timer_func_list (mob_ai_hard, "mob_ai_hard");
-    add_timer_func_list (mob_ai_lazy, "mob_ai_lazy");
-    add_timer_func_list (mobskill_castend_id, "mobskill_castend_id");
-    add_timer_func_list (mobskill_castend_pos, "mobskill_castend_pos");
-    add_timer_func_list (mob_timer_delete, "mob_timer_delete");
     add_timer_interval (gettick () + MIN_MOBTHINKTIME, mob_ai_hard, 0, 0,
                         MIN_MOBTHINKTIME);
     add_timer_interval (gettick () + MIN_MOBTHINKTIME * 10, mob_ai_lazy, 0, 0,
diff --git a/src/map/mob.h b/src/map/mob.h
index 2463283..aff305b 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -1,7 +1,7 @@
 // $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
 #ifndef _MOB_H_
 #define _MOB_H_
-
+#include "../common/timer.h"
 #define MAX_RANDOMMONSTER 3
 
 struct mob_skill
@@ -129,7 +129,7 @@ int  do_init_mob (void);
 
 int  mob_delete (struct mob_data *md);
 int  mob_catch_delete (struct mob_data *md, int type);
-int  mob_timer_delete (int tid, unsigned int tick, int id, int data);
+void mob_timer_delete (timer_id, tick_t, custom_id_t, custom_data_t);
 
 int  mob_deleteslave (struct mob_data *md);
 
@@ -141,8 +141,8 @@ int  mob_warp (struct mob_data *md, int m, int x, int y, int type);
 
 int  mobskill_use (struct mob_data *md, unsigned int tick, int event);
 int  mobskill_event (struct mob_data *md, int flag);
-int  mobskill_castend_id (int tid, unsigned int tick, int id, int data);
-int  mobskill_castend_pos (int tid, unsigned int tick, int id, int data);
+void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
+void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
 int  mob_summonslave (struct mob_data *md2, int *value, int amount, int flag);
 
 int  mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl);
diff --git a/src/map/npc.c b/src/map/npc.c
index 5fd8291..54b13d8 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -6,7 +6,6 @@
 #include <math.h>
 #include <time.h>
 
-#include "../common/malloc.h"
 #include "../common/nullpo.h"
 #include "../common/timer.h"
 
@@ -63,7 +62,7 @@ int npc_enable_sub (struct block_list *bl, va_list ap)
 {
     struct map_session_data *sd;
     struct npc_data *nd;
-    char *name = (char *) aCalloc (50, sizeof (char));
+    char *name = (char *) calloc (50, sizeof (char));
 
     nullpo_retr (0, bl);
     nullpo_retr (0, ap);
@@ -173,15 +172,14 @@ int npc_delete (struct npc_data *nd)
  * イベントの遅延実行
  *------------------------------------------
  */
-int npc_event_timer (int tid, unsigned int tick, int id, int data)
+void npc_event_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = map_id2sd (id);
     if (sd == NULL)
-        return 0;
+        return;
 
     npc_event (sd, (const char *) data, 0);
     free ((void *) data);
-    return 0;
 }
 
 int npc_timer_event (const char *eventname) // Added by RoVeRT
@@ -294,18 +292,18 @@ int npc_event_export (void *key, void *data, va_list ap)
  * 全てのNPCのOn*イベント実行
  *------------------------------------------
  */
-int npc_event_doall_sub (void *key, void *data, va_list ap)
+void npc_event_doall_sub (db_key_t key, db_val_t data, va_list ap)
 {
-    char *p = (char *) key;
+    const char *p = key.s;
     int  rid, argc;
     argrec_t *argv;
     struct event_data *ev;
     int *c;
     const char *name;
 
-    nullpo_retr (0, ev = (struct event_data *) data);
-    nullpo_retr (0, ap);
-    nullpo_retr (0, c = va_arg (ap, int *));
+    nullpo_retv (ev = (struct event_data *) data);
+    nullpo_retv (ap);
+    nullpo_retv (c = va_arg (ap, int *));
 
     name = va_arg (ap, const char *);
     rid = va_arg (ap, int);
@@ -318,8 +316,6 @@ int npc_event_doall_sub (void *key, void *data, va_list ap)
                       argv);
         (*c)++;
     }
-
-    return 0;
 }
 
 int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args)
@@ -333,18 +329,18 @@ int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args)
     return c;
 }
 
-int npc_event_do_sub (void *key, void *data, va_list ap)
+void npc_event_do_sub (db_key_t key, db_val_t data, va_list ap)
 {
-    char *p = (char *) key;
+    const char *p = key.s;
     struct event_data *ev;
     int *c;
     const char *name;
     int  rid, argc;
     argrec_t *argv;
 
-    nullpo_retr (0, ev = (struct event_data *) data);
-    nullpo_retr (0, ap);
-    nullpo_retr (0, c = va_arg (ap, int *));
+    nullpo_retv (ev = (struct event_data *) data);
+    nullpo_retv (ap);
+    nullpo_retv (c = va_arg (ap, int *));
 
     name = va_arg (ap, const char *);
     rid = va_arg (ap, int);
@@ -357,8 +353,6 @@ int npc_event_do_sub (void *key, void *data, va_list ap)
                       argv);
         (*c)++;
     }
-
-    return 0;
 }
 
 int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
@@ -378,7 +372,7 @@ int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
  * 時計イベント実行
  *------------------------------------------
  */
-int npc_event_do_clock (int tid, unsigned int tick, int id, int data)
+void npc_event_do_clock (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     time_t timer;
     struct tm *t;
@@ -406,7 +400,6 @@ int npc_event_do_clock (int tid, unsigned int tick, int id, int data)
         c += npc_event_doall (buf);
     }
     memcpy (&ev_tm_b, t, sizeof (ev_tm_b));
-    return c;
 }
 
 /*==========================================
@@ -482,9 +475,9 @@ int npc_cleareventtimer (struct npc_data *nd)
     return 0;
 }
 
-int npc_do_ontimer_sub (void *key, void *data, va_list ap)
+void npc_do_ontimer_sub (db_key_t key, db_val_t data, va_list ap)
 {
-    char *p = (char *) key;
+    const char *p = key.s;
     struct event_data *ev = (struct event_data *) data;
     int *c = va_arg (ap, int *);
 //  struct map_session_data *sd=va_arg(ap,struct map_session_data *);
@@ -511,7 +504,6 @@ int npc_do_ontimer_sub (void *key, void *data, va_list ap)
             npc_deleventtimer (ev->nd, event);
         }
     }
-    return 0;
 }
 
 int npc_do_ontimer (int npc_id, struct map_session_data *sd, int option)
@@ -567,7 +559,7 @@ int npc_timerevent_import (void *key, void *data, va_list ap)
  * タイマーイベント実行
  *------------------------------------------
  */
-int npc_timerevent (int tid, unsigned int tick, int id, int data)
+void npc_timerevent (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  next, t;
     struct npc_data *nd = (struct npc_data *) map_id2bl (id);
@@ -575,7 +567,7 @@ int npc_timerevent (int tid, unsigned int tick, int id, int data)
     if (nd == NULL || nd->u.scr.nexttimer < 0)
     {
         printf ("npc_timerevent: ??\n");
-        return 0;
+        return;
     }
     nd->u.scr.timertick = tick;
     te = nd->u.scr.timer_event + nd->u.scr.nexttimer;
@@ -590,7 +582,6 @@ int npc_timerevent (int tid, unsigned int tick, int id, int data)
     }
 
     run_script (nd->u.scr.script, te->pos, 0, nd->bl.id);
-    return 0;
 }
 
 /*==========================================
@@ -770,9 +761,9 @@ int npc_event (struct map_session_data *sd, const char *eventname,
     return 0;
 }
 
-int npc_command_sub (void *key, void *data, va_list ap)
+void npc_command_sub (db_key_t key, db_val_t data, va_list ap)
 {
-    char *p = (char *) key;
+    const char *p = key.s;
     struct event_data *ev = (struct event_data *) data;
     char *npcname = va_arg (ap, char *);
     char *command = va_arg (ap, char *);
@@ -786,8 +777,6 @@ int npc_command_sub (void *key, void *data, va_list ap)
         if (strcmp (command, temp) == 0)
             run_script (ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id);
     }
-
-    return 0;
 }
 
 int npc_command (struct map_session_data *sd, char *npcname, char *command)
@@ -858,7 +847,7 @@ int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
         case MESSAGE:
         case SCRIPT:
         {
-            char *name = (char *) aCalloc (50, sizeof (char));
+            char *name = calloc (50, 1);
 
             memcpy (name, map[m].npc[i]->name, 50);
             if (sd->areanpc_id == map[m].npc[i]->bl.id)
@@ -1235,14 +1224,14 @@ void npc_addsrcfile (char *name)
     struct npc_src_list *new;
     size_t len;
 
-    if (strcmpi (name, "clear") == 0)
+    if (strcasecmp (name, "clear") == 0)
     {
         npc_clearsrcfile ();
         return;
     }
 
     len = sizeof (*new) + strlen (name);
-    new = (struct npc_src_list *) aCalloc (1, len);
+    new = (struct npc_src_list *) calloc (1, len);
     new->next = NULL;
     strncpy (new->name, name, strlen (name) + 1);
     if (npc_src_first == NULL)
@@ -1261,7 +1250,7 @@ void npc_delsrcfile (char *name)
 {
     struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first;
 
-    if (strcmpi (name, "all") == 0)
+    if (strcasecmp (name, "all") == 0)
     {
         npc_clearsrcfile ();
         return;
@@ -1302,7 +1291,7 @@ int npc_parse_warp (char *w1, char *w2, char *w3, char *w4)
 
     m = map_mapname2mapid (mapname);
 
-    nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+    nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
     nd->bl.id = npc_get_new_npc_id ();
     nd->n = map_addnpc (m, nd);
 
@@ -1377,7 +1366,7 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
     }
     m = map_mapname2mapid (mapname);
 
-    nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data) +
+    nd = (struct npc_data *) calloc (1, sizeof (struct npc_data) +
                                       sizeof (nd->u.shop_item[0]) * (max +
                                                                      1));
     p = strchr (w4, ',');
@@ -1440,9 +1429,8 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
     nd->opt2 = 0;
     nd->opt3 = 0;
 
-    nd = (struct npc_data *) aRealloc (nd,
-                                       sizeof (struct npc_data) +
-                                       sizeof (nd->u.shop_item[0]) * pos);
+    nd = (struct npc_data *)
+        realloc (nd, sizeof (struct npc_data) + sizeof (nd->u.shop_item[0]) * pos);
 
     //printf("shop npc %s %d read done\n",mapname,nd->bl.id);
     npc_shop++;
@@ -1460,33 +1448,29 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
  * NPCのラベルデータコンバート
  *------------------------------------------
  */
-int npc_convertlabel_db (void *key, void *data, va_list ap)
+void npc_convertlabel_db (db_key_t key, db_val_t data, va_list ap)
 {
-    char *lname = (char *) key;
+    const char *lname = key.s;
     int  pos = (int) data;
     struct npc_data *nd;
     struct npc_label_list *lst;
     int  num;
     char *p = strchr (lname, ':');
 
-    nullpo_retr (0, ap);
-    nullpo_retr (0, nd = va_arg (ap, struct npc_data *));
+    nullpo_retv (ap);
+    nullpo_retv (nd = va_arg (ap, struct npc_data *));
 
     lst = nd->u.scr.label_list;
     num = nd->u.scr.label_list_num;
     if (!lst)
     {
-        lst =
-            (struct npc_label_list *) aCalloc (1,
-                                               sizeof (struct
-                                                       npc_label_list));
+        lst = (struct npc_label_list *)
+                calloc (1, sizeof (struct npc_label_list));
         num = 0;
     }
     else
-        lst =
-            (struct npc_label_list *) aRealloc (lst,
-                                                sizeof (struct npc_label_list)
-                                                * (num + 1));
+        lst = (struct npc_label_list *)
+                realloc (lst, sizeof (struct npc_label_list) * (num + 1));
 
     *p = '\0';
     strncpy (lst[num].name, lname, sizeof(lst[num].name)-1);
@@ -1495,7 +1479,6 @@ int npc_convertlabel_db (void *key, void *data, va_list ap)
     lst[num].pos = pos;
     nd->u.scr.label_list = lst;
     nd->u.scr.label_list_num = num + 1;
-    return 0;
 }
 
 /*==========================================
@@ -1541,7 +1524,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
     if (strcmp (w2, "script") == 0)
     {
         // スクリプトの解析
-        srcbuf = (char *) aCalloc (srcsize, sizeof (char));
+        srcbuf = (char *) calloc (srcsize, sizeof (char));
         if (strchr (first_line, '{'))
         {
             strcpy (srcbuf, strchr (first_line, '{'));
@@ -1562,7 +1545,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
             if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
             {
                 srcsize += 65536;
-                srcbuf = (char *) aRealloc (srcbuf, srcsize);
+                srcbuf = (char *) realloc (srcbuf, srcsize);
                 memset (srcbuf + srcsize - 65536, '\0', 65536);
             }
             if (srcbuf[0] != '{')
@@ -1608,7 +1591,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
 
     }                           // end of スクリプト解析
 
-    nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+    nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
 
     if (m == -1)
     {
@@ -1702,7 +1685,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
         if (evflag)
         {                       // イベント型
             struct event_data *ev =
-                (struct event_data *) aCalloc (1, sizeof (struct event_data));
+                (struct event_data *) calloc (1, sizeof (struct event_data));
             ev->nd = nd;
             ev->pos = 0;
             strdb_insert (ev_db, nd->exname, ev);
@@ -1750,9 +1733,9 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
             struct event_data *ev;
             char *buf;
             // エクスポートされる
-            ev = (struct event_data *) aCalloc (1,
+            ev = (struct event_data *) calloc (1,
                                                 sizeof (struct event_data));
-            buf = (char *) aCalloc (50, sizeof (char));
+            buf = (char *) calloc (50, sizeof (char));
             if (strlen (lname) > 24)
             {
                 printf ("npc_parse_script: label name error !\n");
@@ -1781,11 +1764,11 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
             struct npc_timerevent_list *te = nd->u.scr.timer_event;
             int  j, k = nd->u.scr.timeramount;
             if (te == NULL)
-                te = (struct npc_timerevent_list *) aCalloc (1,
+                te = (struct npc_timerevent_list *) calloc (1,
                                                              sizeof (struct
                                                                      npc_timerevent_list));
             else
-                te = (struct npc_timerevent_list *) aRealloc (te,
+                te = (struct npc_timerevent_list *) realloc (te,
                                                               sizeof (struct
                                                                       npc_timerevent_list)
                                                               * (k + 1));
@@ -1826,7 +1809,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
     char *p;
 
     // スクリプトの解析
-    srcbuf = (char *) aCalloc (srcsize, sizeof (char));
+    srcbuf = (char *) calloc (srcsize, sizeof (char));
     if (strchr (first_line, '{'))
     {
         strcpy (srcbuf, strchr (first_line, '{'));
@@ -1847,7 +1830,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
         if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
         {
             srcsize += 65536;
-            srcbuf = (char *) aRealloc (srcbuf, srcsize);
+            srcbuf = (char *) realloc (srcbuf, srcsize);
             memset (srcbuf + srcsize - 65536, '\0', 65536);
         }
         if (srcbuf[0] != '{')
@@ -1869,7 +1852,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
         return 1;
     }
 
-    p = (char *) aCalloc (50, sizeof (char));
+    p = (char *) calloc (50, sizeof (char));
 
     strncpy (p, w3, 49);
     strdb_insert (script_get_userfunc_db (), p, script);
@@ -1917,7 +1900,7 @@ int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
 
     for (i = 0; i < num; i++)
     {
-        md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
+        md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
 
         md->bl.prev = NULL;
         md->bl.next = NULL;
@@ -1949,7 +1932,7 @@ int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
 
         if (mob_db[class].mode & 0x02)
             md->lootitem =
-                (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+                (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
         else
             md->lootitem = NULL;
 
@@ -1993,7 +1976,7 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
         return 1;
 
 //マップフラグ
-    if (strcmpi (w3, "nosave") == 0)
+    if (strcasecmp (w3, "nosave") == 0)
     {
         if (strcmp (w4, "SavePoint") == 0)
         {
@@ -2009,51 +1992,51 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
         }
         map[m].flag.nosave = 1;
     }
-    else if (strcmpi (w3, "nomemo") == 0)
+    else if (strcasecmp (w3, "nomemo") == 0)
     {
         map[m].flag.nomemo = 1;
     }
-    else if (strcmpi (w3, "noteleport") == 0)
+    else if (strcasecmp (w3, "noteleport") == 0)
     {
         map[m].flag.noteleport = 1;
     }
-    else if (strcmpi (w3, "nowarp") == 0)
+    else if (strcasecmp (w3, "nowarp") == 0)
     {
         map[m].flag.nowarp = 1;
     }
-    else if (strcmpi (w3, "nowarpto") == 0)
+    else if (strcasecmp (w3, "nowarpto") == 0)
     {
         map[m].flag.nowarpto = 1;
     }
-    else if (strcmpi (w3, "noreturn") == 0)
+    else if (strcasecmp (w3, "noreturn") == 0)
     {
         map[m].flag.noreturn = 1;
     }
-    else if (strcmpi (w3, "monster_noteleport") == 0)
+    else if (strcasecmp (w3, "monster_noteleport") == 0)
     {
         map[m].flag.monster_noteleport = 1;
     }
-    else if (strcmpi (w3, "nobranch") == 0)
+    else if (strcasecmp (w3, "nobranch") == 0)
     {
         map[m].flag.nobranch = 1;
     }
-    else if (strcmpi (w3, "nopenalty") == 0)
+    else if (strcasecmp (w3, "nopenalty") == 0)
     {
         map[m].flag.nopenalty = 1;
     }
-    else if (strcmpi (w3, "pvp") == 0)
+    else if (strcasecmp (w3, "pvp") == 0)
     {
         map[m].flag.pvp = 1;
     }
-    else if (strcmpi (w3, "pvp_noparty") == 0)
+    else if (strcasecmp (w3, "pvp_noparty") == 0)
     {
         map[m].flag.pvp_noparty = 1;
     }
-    else if (strcmpi (w3, "pvp_noguild") == 0)
+    else if (strcasecmp (w3, "pvp_noguild") == 0)
     {
         map[m].flag.pvp_noguild = 1;
     }
-    else if (strcmpi (w3, "pvp_nightmaredrop") == 0)
+    else if (strcasecmp (w3, "pvp_nightmaredrop") == 0)
     {
         if (sscanf (w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) ==
             3)
@@ -2086,64 +2069,64 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
             }
         }
     }
-    else if (strcmpi (w3, "pvp_nocalcrank") == 0)
+    else if (strcasecmp (w3, "pvp_nocalcrank") == 0)
     {
         map[m].flag.pvp_nocalcrank = 1;
     }
-    else if (strcmpi (w3, "gvg") == 0)
+    else if (strcasecmp (w3, "gvg") == 0)
     {
         map[m].flag.gvg = 1;
     }
-    else if (strcmpi (w3, "gvg_noparty") == 0)
+    else if (strcasecmp (w3, "gvg_noparty") == 0)
     {
         map[m].flag.gvg_noparty = 1;
     }
-    else if (strcmpi (w3, "nozenypenalty") == 0)
+    else if (strcasecmp (w3, "nozenypenalty") == 0)
     {
         map[m].flag.nozenypenalty = 1;
     }
-    else if (strcmpi (w3, "notrade") == 0)
+    else if (strcasecmp (w3, "notrade") == 0)
     {
         map[m].flag.notrade = 1;
     }
-    else if (strcmpi (w3, "noskill") == 0)
+    else if (strcasecmp (w3, "noskill") == 0)
     {
         map[m].flag.noskill = 1;
     }
-    else if (battle_config.pk_mode && strcmpi (w3, "nopvp") == 0)
+    else if (battle_config.pk_mode && strcasecmp (w3, "nopvp") == 0)
     {                           // nopvp for pk mode [Valaris]
         map[m].flag.nopvp = 1;
         map[m].flag.pvp = 0;
     }
-    else if (strcmpi (w3, "noicewall") == 0)
+    else if (strcasecmp (w3, "noicewall") == 0)
     {                           // noicewall [Valaris]
         map[m].flag.noicewall = 1;
     }
-    else if (strcmpi (w3, "snow") == 0)
+    else if (strcasecmp (w3, "snow") == 0)
     {                           // snow [Valaris]
         map[m].flag.snow = 1;
     }
-    else if (strcmpi (w3, "fog") == 0)
+    else if (strcasecmp (w3, "fog") == 0)
     {                           // fog [Valaris]
         map[m].flag.fog = 1;
     }
-    else if (strcmpi (w3, "sakura") == 0)
+    else if (strcasecmp (w3, "sakura") == 0)
     {                           // sakura [Valaris]
         map[m].flag.sakura = 1;
     }
-    else if (strcmpi (w3, "leaves") == 0)
+    else if (strcasecmp (w3, "leaves") == 0)
     {                           // leaves [Valaris]
         map[m].flag.leaves = 1;
     }
-    else if (strcmpi (w3, "rain") == 0)
+    else if (strcasecmp (w3, "rain") == 0)
     {                           // rain [Valaris]
         map[m].flag.rain = 1;
     }
-    else if (strcmpi (w3, "no_player_drops") == 0)
+    else if (strcasecmp (w3, "no_player_drops") == 0)
     {                           // no player drops [Jaxad0127]
         map[m].flag.no_player_drops = 1;
     }
-    else if (strcmpi (w3, "town") == 0)
+    else if (strcasecmp (w3, "town") == 0)
     {                           // town/safe zone [remoitnane]
         map[m].flag.town = 1;
     }
@@ -2151,24 +2134,18 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
     return 0;
 }
 
-static int ev_db_final (void *key, void *data, va_list ap)
+static void ev_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     free (data);
-    if (strstr (key, "::") != NULL)
-        free (key);
-    return 0;
-}
-
-static int npcname_db_final (void *key, void *data, va_list ap)
-{
-    return 0;
+    if (strstr (key.s, "::") != NULL)
+        free ((char*)key.s);
 }
 
 struct npc_data *npc_spawn_text (int m, int x, int y,
                                  int class, char *name, char *message)
 {
     struct npc_data *retval =
-        (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+        (struct npc_data *) calloc (1, sizeof (struct npc_data));
     retval->bl.id = npc_get_new_npc_id ();
     retval->bl.x = x;
     retval->bl.y = y;
@@ -2259,8 +2236,6 @@ int do_final_npc (void)
 
     if (ev_db)
         strdb_final (ev_db, ev_db_final);
-    if (npcname_db)
-        strdb_final (npcname_db, npcname_db_final);
 
     for (i = START_NPC_NUM; i < npc_id; i++)
     {
@@ -2284,12 +2259,10 @@ int do_final_npc (void)
     return 0;
 }
 
-void ev_release (struct dbn *db, int which)
+void ev_release (db_key_t key, db_val_t val)
 {
-    if (which & 0x1)
-        free (db->key);
-    if (which & 0x2)
-        free (db->data);
+    free ((char*)key.s);
+    free (val);
 }
 
 /*==========================================
@@ -2361,7 +2334,7 @@ int do_init_npc (void)
                 continue;
             }
             // マップの存在確認
-            if (strcmp (w1, "-") != 0 && strcmpi (w1, "function") != 0)
+            if (strcmp (w1, "-") != 0 && strcasecmp (w1, "function") != 0)
             {
                 sscanf (w1, "%[^,]", mapname);
                 m = map_mapname2mapid (mapname);
@@ -2371,17 +2344,17 @@ int do_init_npc (void)
                     continue;
                 }
             }
-            if (strcmpi (w2, "warp") == 0 && count > 3)
+            if (strcasecmp (w2, "warp") == 0 && count > 3)
             {
                 npc_parse_warp (w1, w2, w3, w4);
             }
-            else if (strcmpi (w2, "shop") == 0 && count > 3)
+            else if (strcasecmp (w2, "shop") == 0 && count > 3)
             {
                 npc_parse_shop (w1, w2, w3, w4);
             }
-            else if (strcmpi (w2, "script") == 0 && count > 3)
+            else if (strcasecmp (w2, "script") == 0 && count > 3)
             {
-                if (strcmpi (w1, "function") == 0)
+                if (strcasecmp (w1, "function") == 0)
                 {
                     npc_parse_function (w1, w2, w3, w4, line + w4pos, fp,
                                         &lines);
@@ -2399,11 +2372,11 @@ int do_init_npc (void)
             {
                 npc_parse_script (w1, w2, w3, w4, line + w4pos, fp, &lines);
             }
-            else if (strcmpi (w2, "monster") == 0 && count > 3)
+            else if (strcasecmp (w2, "monster") == 0 && count > 3)
             {
                 npc_parse_mob (w1, w2, w3, w4);
             }
-            else if (strcmpi (w2, "mapflag") == 0 && count >= 3)
+            else if (strcasecmp (w2, "mapflag") == 0 && count >= 3)
             {
                 npc_parse_mapflag (w1, w2, w3, w4);
             }
@@ -2416,11 +2389,5 @@ int do_init_npc (void)
     printf ("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
             npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob);
 
-    add_timer_func_list (npc_event_timer, "npc_event_timer");
-    add_timer_func_list (npc_event_do_clock, "npc_event_do_clock");
-    add_timer_func_list (npc_timerevent, "npc_timerevent");
-
-    //exit(1);
-
     return 0;
 }
diff --git a/src/map/npc.h b/src/map/npc.h
index 4c08c02..248bad7 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -9,7 +9,7 @@
 #define INVISIBLE_CLASS 32767
 
 int  npc_event_dequeue (struct map_session_data *sd);
-int  npc_event_timer (int tid, unsigned int tick, int id, int data);
+void npc_event_timer (timer_id, tick_t, custom_id_t, custom_data_t);
 int  npc_event (struct map_session_data *sd, const char *npcname, int);
 int  npc_timer_event (const char *eventname);   // Added by RoVeRT
 int  npc_command (struct map_session_data *sd, char *npcname, char *command);
diff --git a/src/map/party.c b/src/map/party.c
index 4e59fae..cc35d2a 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -8,7 +8,6 @@
 #include "../common/timer.h"
 #include "../common/socket.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 #include "pc.h"
 #include "map.h"
 #include "battle.h"
@@ -25,15 +24,14 @@
 
 static struct dbt *party_db;
 
-int  party_send_xyhp_timer (int tid, unsigned int tick, int id, int data);
+void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
 /*==========================================
  * 終了
  *------------------------------------------
  */
-static int party_db_final (void *key, void *data, va_list ap)
+static void party_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     free (data);
-    return 0;
 }
 
 void do_final_party (void)
@@ -46,7 +44,6 @@ void do_final_party (void)
 void do_init_party (void)
 {
     party_db = numdb_init ();
-    add_timer_func_list (party_send_xyhp_timer, "party_send_xyhp_timer");
     add_timer_interval (gettick () + PARTY_SEND_XYHP_INVERVAL,
                         party_send_xyhp_timer, 0, 0,
                         PARTY_SEND_XYHP_INVERVAL);
@@ -58,15 +55,14 @@ struct party *party_search (int party_id)
     return numdb_search (party_db, party_id);
 }
 
-int party_searchname_sub (void *key, void *data, va_list ap)
+void party_searchname_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct party *p = (struct party *) data, **dst;
     char *str;
     str = va_arg (ap, char *);
     dst = va_arg (ap, struct party **);
-    if (strcmpi (p->name, str) == 0)
+    if (strcasecmp (p->name, str) == 0)
         *dst = p;
-    return 0;
 }
 
 // パーティ名検索
@@ -120,7 +116,7 @@ int party_created (int account_id, int fail, int party_id, char *name)
             exit (1);
         }
 
-        p = (struct party *) aCalloc (1, sizeof (struct party));
+        CREATE (p, struct party, 1);
         p->party_id = party_id;
         memcpy (p->name, name, 24);
         numdb_insert (party_db, party_id, p);
@@ -205,7 +201,7 @@ int party_recv_info (struct party *sp)
 
     if ((p = numdb_search (party_db, sp->party_id)) == NULL)
     {
-        p = (struct party *) aCalloc (1, sizeof (struct party));
+        CREATE (p, struct party, 1);
         numdb_insert (party_db, sp->party_id, p);
 
         // 最初のロードなのでユーザーのチェックを行う
@@ -574,7 +570,7 @@ int party_send_movemap (struct map_session_data *sd)
     if (sd->party_sended != 0)  // もうパーティデータは送信済み
         return 0;
 
-    // 競合確認 
+    // 競合確認
     party_check_conflict (sd);
 
     // あるならパーティ情報送信
@@ -645,12 +641,12 @@ int party_check_conflict (struct map_session_data *sd)
 }
 
 // 位置やHP通知用
-int party_send_xyhp_timer_sub (void *key, void *data, va_list ap)
+void party_send_xyhp_timer_sub (db_key_t key, db_val_t data, va_list ap)
 {
     struct party *p = (struct party *) data;
     int  i;
 
-    nullpo_retr (0, p);
+    nullpo_retv (p);
 
     for (i = 0; i < MAX_PARTY; i++)
     {
@@ -673,14 +669,12 @@ int party_send_xyhp_timer_sub (void *key, void *data, va_list ap)
 
         }
     }
-    return 0;
 }
 
 // 位置やHP通知
-int party_send_xyhp_timer (int tid, unsigned int tick, int id, int data)
+void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     numdb_foreach (party_db, party_send_xyhp_timer_sub, tick);
-    return 0;
 }
 
 // 位置通知クリア
diff --git a/src/map/pc.c b/src/map/pc.c
index fc2732f..ac03334 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -9,8 +9,8 @@
 #include "../common/timer.h"
 #include "../common/db.h"
 
-#include "../common/malloc.h"
 #include "../common/nullpo.h"
+#include "../common/mt_rand.h"
 
 #include "atcommand.h"
 #include "battle.h"
@@ -171,23 +171,21 @@ static int distance (int x0, int y0, int x1, int y1)
     return dx > dy ? dx : dy;
 }
 
-static int pc_invincible_timer (int tid, unsigned int tick, int id, int data)
+static void pc_invincible_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd;
 
     if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
         || sd->bl.type != BL_PC)
-        return 1;
+        return;
 
     if (sd->invincible_timer != tid)
     {
         if (battle_config.error_log)
             printf ("invincible_timer %d != %d\n", sd->invincible_timer, tid);
-        return 0;
+        return;
     }
     sd->invincible_timer = -1;
-
-    return 0;
 }
 
 int pc_setinvincibletimer (struct map_session_data *sd, int val)
@@ -213,20 +211,20 @@ int pc_delinvincibletimer (struct map_session_data *sd)
     return 0;
 }
 
-static int pc_spiritball_timer (int tid, unsigned int tick, int id, int data)
+static void pc_spiritball_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd;
     int  i;
 
     if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
         || sd->bl.type != BL_PC)
-        return 1;
+        return;
 
     if (sd->spirit_timer[0] != tid)
     {
         if (battle_config.error_log)
             printf ("spirit_timer %d != %d\n", sd->spirit_timer[0], tid);
-        return 0;
+        return;
     }
     sd->spirit_timer[0] = -1;
     for (i = 1; i < sd->spiritball; i++)
@@ -238,8 +236,6 @@ static int pc_spiritball_timer (int tid, unsigned int tick, int id, int data)
     if (sd->spiritball < 0)
         sd->spiritball = 0;
     clif_spiritball (sd);
-
-    return 0;
 }
 
 int pc_addspiritball (struct map_session_data *sd, int interval, int max)
@@ -4334,7 +4330,7 @@ static int calc_next_walk_step (struct map_session_data *sd)
  * 半歩進む(timer関数)
  *------------------------------------------
  */
-static int pc_walk (int tid, unsigned int tick, int id, int data)
+static void pc_walk (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd;
     int  i, ctype;
@@ -4343,18 +4339,18 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
 
     sd = map_id2sd (id);
     if (sd == NULL)
-        return 0;
+        return;
 
     if (sd->walktimer != tid)
     {
         if (battle_config.error_log)
             printf ("pc_walk %d != %d\n", sd->walktimer, tid);
-        return 0;
+        return;
     }
     sd->walktimer = -1;
     if (sd->walkpath.path_pos >= sd->walkpath.path_len
         || sd->walkpath.path_pos != data)
-        return 0;
+        return;
 
     //歩いたので息吹のタイマーを初期化
     sd->inchealspirithptick = 0;
@@ -4367,13 +4363,13 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
         if (sd->state.change_walk_target)
         {
             pc_walktoxy_sub (sd);
-            return 0;
+            return;
         }
     }
     else
     {                           // マス目境界へ到着
         if (sd->walkpath.path[sd->walkpath.path_pos] >= 8)
-            return 1;
+            return;
 
         x = sd->bl.x;
         y = sd->bl.y;
@@ -4381,7 +4377,7 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
         if (ctype == 1 || ctype == 5)
         {
             pc_stop_walking (sd, 1);
-            return 0;
+            return;
         }
         sd->dir = sd->head_dir = sd->walkpath.path[sd->walkpath.path_pos];
         dx = dirx[(int) sd->dir];
@@ -4390,7 +4386,7 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
         if (ctype == 1 || ctype == 5)
         {
             pc_walktoxy_sub (sd);
-            return 0;
+            return;
         }
 
         moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE
@@ -4465,8 +4461,6 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
         sd->walktimer =
             add_timer (tick + i, pc_walk, id, sd->walkpath.path_pos);
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -4804,7 +4798,7 @@ struct pc_base_job pc_calc_base_job (int b_class)
  * PCの攻撃 (timer関数)
  *------------------------------------------
  */
-int pc_attack_timer (int tid, unsigned int tick, int id, int data)
+void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd;
     struct block_list *bl;
@@ -4815,48 +4809,48 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
 
     sd = map_id2sd (id);
     if (sd == NULL)
-        return 0;
+        return;
     if (sd->attacktimer != tid)
     {
         if (battle_config.error_log)
             printf ("pc_attack_timer %d != %d\n", sd->attacktimer, tid);
-        return 0;
+        return;
     }
     sd->attacktimer = -1;
 
     if (sd->bl.prev == NULL)
-        return 0;
+        return;
 
     bl = map_id2bl (sd->attacktarget);
     if (bl == NULL || bl->prev == NULL)
-        return 0;
+        return;
 
     if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl))
-        return 0;
+        return;
 
     // 同じmapでないなら攻撃しない
     // PCが死んでても攻撃しない
     if (sd->bl.m != bl->m || pc_isdead (sd))
-        return 0;
+        return;
 
     if (sd->opt1 > 0 || sd->status.option & 2 || sd->status.option & 16388) // 異常などで攻撃できない
-        return 0;
+        return;
 
     if (sd->sc_data[SC_AUTOCOUNTER].timer != -1)
-        return 0;
+        return;
     if (sd->sc_data[SC_BLADESTOP].timer != -1)
-        return 0;
+        return;
 
     if ((opt = battle_get_option (bl)) != NULL && *opt & 0x46)
-        return 0;
+        return;
     if (((sc_data = battle_get_sc_data (bl)) != NULL
          && sc_data[SC_TRICKDEAD].timer != -1)
         || ((sc_data = battle_get_sc_data (bl)) != NULL
             && sc_data[SC_BASILICA].timer != -1))
-        return 0;
+        return;
 
     if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0)
-        return 0;
+        return;
 
     if (!battle_config.sdelay_attack_enable
         && pc_checkskill (sd, SA_FREECAST) <= 0)
@@ -4864,12 +4858,12 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
         if (DIFF_TICK (tick, sd->canact_tick) < 0)
         {
             clif_skill_fail (sd, 1, 4, 0);
-            return 0;
+            return;
         }
     }
 
     if (sd->attackabletime > tick)
-        return 0;               // cannot attack yet
+        return;               // cannot attack yet
 
     attack_spell_delay = sd->attack_spell_delay;
     if (sd->attack_spell_override   // [Fate] If we have an active attack spell, use that
@@ -4889,7 +4883,7 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
         {                       // 届 かないので移動
             //if(pc_can_reach(sd,bl->x,bl->y))
             //clif_movetoattack(sd,bl);
-            return 0;
+            return;
         }
 
         if (dist <= range && !battle_check_range (&sd->bl, bl, range))
@@ -4944,8 +4938,6 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
         sd->attacktimer =
             add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0);
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -5011,13 +5003,13 @@ int pc_stopattack (struct map_session_data *sd)
     return 0;
 }
 
-int pc_follow_timer (int tid, unsigned int tick, int id, int data)
+void pc_follow_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd, *bl;
 
     sd = map_id2sd (id);
     if (sd == NULL || sd->followtimer != tid)
-        return 0;
+        return;
 
     sd->followtimer = -1;
 
@@ -5029,14 +5021,14 @@ int pc_follow_timer (int tid, unsigned int tick, int id, int data)
         bl = (struct map_session_data *) map_id2bl (sd->followtarget);
 
         if (bl == NULL)
-            return 0;
+            return;
 
         if (bl->bl.prev == NULL)
             break;
 
         if (bl->bl.type == BL_PC
             && pc_isdead ((struct map_session_data *) bl))
-            return 0;
+            return;
 
         if (sd->skilltimer == -1 && sd->attacktimer == -1
             && sd->walktimer == -1)
@@ -5056,8 +5048,6 @@ int pc_follow_timer (int tid, unsigned int tick, int id, int data)
 
     sd->followtimer =
         add_timer (tick + sd->aspd, pc_follow_timer, sd->bl.id, 0);
-
-    return 0;
 }
 
 int pc_follow (struct map_session_data *sd, int target_id)
@@ -5677,8 +5667,8 @@ int pc_resetlvl (struct map_session_data *sd, int type)
         sd->status.skill_point = 0;
         sd->status.base_level = 1;
         sd->status.job_level = 1;
-        sd->status.base_exp = sd->status.base_exp = 0;
-        sd->status.job_exp = sd->status.job_exp = 0;
+        sd->status.base_exp = 0;
+        sd->status.job_exp = 0;
         if (sd->status.option != 0)
             sd->status.option = 0;
 
@@ -7213,12 +7203,12 @@ int pc_percentrefinery (struct map_session_data *sd, struct item *item)
  * イベントタイマー処理
  *------------------------------------------
  */
-int pc_eventtimer (int tid, unsigned int tick, int id, int data)
+void pc_eventtimer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = map_id2sd (id);
     int  i;
     if (sd == NULL)
-        return 0;
+        return;
 
     for (i = 0; i < MAX_EVENTTIMER; i++)
     {
@@ -7235,8 +7225,6 @@ int pc_eventtimer (int tid, unsigned int tick, int id, int data)
         if (battle_config.error_log)
             printf ("pc_eventtimer: no such event timer\n");
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -7255,7 +7243,7 @@ int pc_addeventtimer (struct map_session_data *sd, int tick, const char *name)
 
     if (i < MAX_EVENTTIMER)
     {
-        char *evname = (char *) aCalloc (24, sizeof (char));
+        char *evname = (char *) calloc (24, 1);
         strncpy (evname, name, 24);
         evname[23] = '\0';
         sd->eventtimer[i] = add_timer (gettick () + tick,
@@ -7811,20 +7799,19 @@ int pc_calc_pvprank (struct map_session_data *sd)
  * PVP順位計算(timer)
  *------------------------------------------
  */
-int pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data)
+void pc_calc_pvprank_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = NULL;
     if (battle_config.pk_mode)  // disable pvp ranking if pk_mode on [Valaris]
-        return 0;
+        return;
 
     sd = map_id2sd (id);
     if (sd == NULL)
-        return 0;
+        return;
     sd->pvp_timer = -1;
     if (pc_calc_pvprank (sd) > 0)
         sd->pvp_timer = add_timer (gettick () + PVP_CALCRANK_INTERVAL,
                                    pc_calc_pvprank_timer, id, data);
-    return 0;
 }
 
 /*==========================================
@@ -8387,7 +8374,7 @@ static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
  * HP/SP自然回復 (interval timer関数)
  *------------------------------------------
  */
-int pc_natural_heal (int tid, unsigned int tick, int id, int data)
+void pc_natural_heal (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     natural_heal_tick = tick;
     natural_heal_diff_tick =
@@ -8395,7 +8382,6 @@ int pc_natural_heal (int tid, unsigned int tick, int id, int data)
     clif_foreachclient (pc_natural_heal_sub);
 
     natural_heal_prev_tick = tick;
-    return 0;
 }
 
 /*==========================================
@@ -8465,7 +8451,7 @@ static int pc_autosave_sub (struct map_session_data *sd, va_list ap)
  * 自動セーブ (timer関数)
  *------------------------------------------
  */
-int pc_autosave (int tid, unsigned int tick, int id, int data)
+void pc_autosave (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  interval;
 
@@ -8478,8 +8464,6 @@ int pc_autosave (int tid, unsigned int tick, int id, int data)
     if (interval <= 0)
         interval = 1;
     add_timer (gettick () + interval, pc_autosave, 0, 0);
-
-    return 0;
 }
 
 int pc_read_gm_account (int fd)
@@ -8505,7 +8489,7 @@ int pc_read_gm_account (int fd)
  * timer to do the day
  *------------------------------------------
  */
-int map_day_timer (int tid, unsigned int tick, int id, int data)
+void map_day_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {                               // by [yor]
     struct map_session_data *pl_sd = NULL;
     int  i;
@@ -8530,15 +8514,13 @@ int map_day_timer (int tid, unsigned int tick, int id, int data)
             }
         }
     }
-
-    return 0;
 }
 
 /*==========================================
  * timer to do the night
  *------------------------------------------
  */
-int map_night_timer (int tid, unsigned int tick, int id, int data)
+void map_night_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {                               // by [yor]
     struct map_session_data *pl_sd = NULL;
     int  i;
@@ -8563,8 +8545,6 @@ int map_night_timer (int tid, unsigned int tick, int id, int data)
             }
         }
     }
-
-    return 0;
 }
 
 void pc_setstand (struct map_session_data *sd)
@@ -8973,22 +8953,11 @@ int do_init_pc (void)
 
 //  gm_account_db = numdb_init();
 
-    add_timer_func_list (pc_walk, "pc_walk");
-    add_timer_func_list (pc_attack_timer, "pc_attack_timer");
-    add_timer_func_list (pc_natural_heal, "pc_natural_heal");
-    add_timer_func_list (pc_invincible_timer, "pc_invincible_timer");
-    add_timer_func_list (pc_eventtimer, "pc_eventtimer");
-    add_timer_func_list (pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
-    add_timer_func_list (pc_autosave, "pc_autosave");
-    add_timer_func_list (pc_spiritball_timer, "pc_spiritball_timer");
     add_timer_interval ((natural_heal_prev_tick =
                          gettick () + NATURAL_HEAL_INTERVAL), pc_natural_heal,
                         0, 0, NATURAL_HEAL_INTERVAL);
     add_timer (gettick () + autosave_interval, pc_autosave, 0, 0);
 
-    // add night/day timer (by [yor])
-    add_timer_func_list (map_day_timer, "map_day_timer");   // by [yor]
-    add_timer_func_list (map_night_timer, "map_night_timer");   // by [yor]
     {
         int  day_duration = battle_config.day_duration;
         int  night_duration = battle_config.night_duration;
diff --git a/src/map/pc.h b/src/map/pc.h
index 20ae26e..742d9d4 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -169,7 +169,7 @@ int  pc_addeventtimercount (struct map_session_data *sd, const char *name,
                             int tick);
 
 int  pc_calc_pvprank (struct map_session_data *sd);
-int  pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data);
+void pc_calc_pvprank_timer (timer_id, tick_t, custom_id_t, custom_data_t);
 
 int  pc_ismarried (struct map_session_data *sd);
 int  pc_marriage (struct map_session_data *sd,
@@ -202,9 +202,9 @@ enum
 { ADDITEM_EXIST, ADDITEM_NEW, ADDITEM_OVERAMOUNT };
 
 // timer for night.day
-int  day_timer_tid;
-int  night_timer_tid;
-int  map_day_timer (int, unsigned int, int, int);   // by [yor]
-int  map_night_timer (int, unsigned int, int, int); // by [yor]
+timer_id day_timer_tid;
+timer_id night_timer_tid;
+void map_day_timer (timer_id, tick_t, custom_id_t, custom_data_t);   // by [yor]
+void map_night_timer (timer_id, tick_t, custom_id_t, custom_data_t); // by [yor]
 
 #endif
diff --git a/src/map/script.c b/src/map/script.c
index 0c01ac0..fb8b8af 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -17,8 +17,8 @@
 
 #include "../common/socket.h"
 #include "../common/timer.h"
-#include "../common/malloc.h"
 #include "../common/lock.h"
+#include "../common/mt_rand.h"
 
 #include "atcommand.h"
 #include "battle.h"
@@ -85,11 +85,6 @@ struct dbt *script_get_userfunc_db ()
     return userfunc_db;
 }
 
-int scriptlabel_final (void *k, void *d, va_list ap)
-{
-    return 0;
-}
-
 static char pos[11][100] =
     { "頭", "体", "左手", "右手", "ローブ", "靴", "アクセサリー1",
     "アクセサリー2", "頭2", "頭3", "装着していない"
@@ -831,13 +826,13 @@ static int add_str (const unsigned char *p)
     if (str_num >= str_data_size)
     {
         str_data_size += 128;
-        str_data = aRealloc (str_data, sizeof (str_data[0]) * str_data_size);
+        str_data = realloc (str_data, sizeof (str_data[0]) * str_data_size);
         memset (str_data + (str_data_size - 128), '\0', 128);
     }
     while (str_pos + strlen (p) + 1 >= str_size)
     {
         str_size += 256;
-        str_buf = (char *) aRealloc (str_buf, str_size);
+        str_buf = (char *) realloc (str_buf, str_size);
         memset (str_buf + (str_size - 256), '\0', 256);
     }
     strcpy (str_buf + str_pos, p);
@@ -860,7 +855,7 @@ static void check_script_buf (int size)
     if (script_pos + size >= script_size)
     {
         script_size += SCRIPT_BLOCK_SIZE;
-        script_buf = (char *) aRealloc (script_buf, script_size);
+        script_buf = (char *) realloc (script_buf, script_size);
         memset (script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
                 SCRIPT_BLOCK_SIZE);
     }
@@ -1474,8 +1469,7 @@ unsigned char *parse_script (unsigned char *src, int line)
         read_constdb ();
     }
     first = 0;
-    script_buf =
-        (unsigned char *) aCalloc (SCRIPT_BLOCK_SIZE, sizeof (unsigned char));
+    script_buf = (unsigned char *) calloc (SCRIPT_BLOCK_SIZE, 1);
     script_pos = 0;
     script_size = SCRIPT_BLOCK_SIZE;
     str_data[LABEL_NEXTLINE].type = C_NOP;
@@ -1493,7 +1487,7 @@ unsigned char *parse_script (unsigned char *src, int line)
 
     // 外部用label dbの初期化
     if (scriptlabel_db != NULL)
-        strdb_final (scriptlabel_db, scriptlabel_final);
+        strdb_final (scriptlabel_db, NULL);
     scriptlabel_db = strdb_init (50);
 
     // for error message
@@ -1526,7 +1520,7 @@ unsigned char *parse_script (unsigned char *src, int line)
                 exit (1);
             }
             set_label (l, script_pos);
-            strdb_insert (scriptlabel_db, p, script_pos);   // 外部用label db登録
+            strdb_insert (scriptlabel_db, (const char*)p, script_pos);   // 外部用label db登録
             *skip_word (p) = c;
             p = tmpp + 1;
             continue;
@@ -1546,7 +1540,7 @@ unsigned char *parse_script (unsigned char *src, int line)
     add_scriptc (C_NOP);
 
     script_size = script_pos;
-    script_buf = (char *) aRealloc (script_buf, script_pos + 1);
+    script_buf = (char *) realloc (script_buf, script_pos + 1);
 
     // 未解決のラベルを解決
     for (i = LABEL_START; i < str_num; i++)
@@ -1772,7 +1766,7 @@ char *conv_str (struct script_state *st, struct script_data *data)
     if (data->type == C_INT)
     {
         char *buf;
-        buf = (char *) aCalloc (16, sizeof (char));
+        buf = (char *) calloc (16, 1);
         sprintf (buf, "%d", data->u.num);
         data->type = C_STR;
         data->u.str = buf;
@@ -1816,10 +1810,9 @@ void push_val (struct script_stack *stack, int type, int val)
     if (stack->sp >= stack->sp_max)
     {
         stack->sp_max += 64;
-        stack->stack_data =
-            (struct script_data *) aRealloc (stack->stack_data,
-                                             sizeof (stack->stack_data[0]) *
-                                             stack->sp_max);
+        stack->stack_data = (struct script_data *)
+            realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+                                        stack->sp_max);
         memset (stack->stack_data + (stack->sp_max - 64), 0,
                 64 * sizeof (*(stack->stack_data)));
     }
@@ -1839,10 +1832,9 @@ void push_str (struct script_stack *stack, int type, unsigned char *str)
     if (stack->sp >= stack->sp_max)
     {
         stack->sp_max += 64;
-        stack->stack_data =
-            (struct script_data *) aRealloc (stack->stack_data,
-                                             sizeof (stack->stack_data[0]) *
-                                             stack->sp_max);
+        stack->stack_data = (struct script_data *)
+            realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+                                        stack->sp_max);
         memset (stack->stack_data + (stack->sp_max - 64), '\0',
                 64 * sizeof (*(stack->stack_data)));
     }
@@ -2091,7 +2083,7 @@ int buildin_menu (struct script_state *st)
         st->state = RERUNLINE;
         sd->state.menu_or_input = 1;
 
-        buf = (char *) aCalloc (len + 1, sizeof (char));
+        buf = (char *) calloc (len + 1, 1);
         buf[0] = 0;
         for (i = st->start + 2; menu_choices > 0; i += 2, --menu_choices)
         {
@@ -3180,7 +3172,7 @@ char *buildin_getpartyname_sub (int party_id)
     if (p != NULL)
     {
         char *buf;
-        buf = (char *) aCalloc (24, sizeof (char));
+        buf = (char *) calloc (24, 1);
         strcpy (buf, p->name);
         return buf;
     }
@@ -3245,7 +3237,7 @@ char *buildin_getguildname_sub (int guild_id)
     if (g != NULL)
     {
         char *buf;
-        buf = (char *) aCalloc (24, sizeof (char));
+        buf = (char *) calloc (24, 1);
         strcpy (buf, g->name);
         return buf;
     }
@@ -3276,7 +3268,7 @@ char *buildin_getguildmaster_sub (int guild_id)
     if (g != NULL)
     {
         char *buf;
-        buf = (char *) aCalloc (24, sizeof (char));
+        buf = (char *) calloc (24, 1);
         strncpy (buf, g->master, 23);
         return buf;
     }
@@ -3332,7 +3324,7 @@ int buildin_strcharinfo (struct script_state *st)
     if (num == 0)
     {
         char *buf;
-        buf = (char *) aCalloc (24, sizeof (char));
+        buf = (char *) calloc (24, 1);
         strncpy (buf, sd->status.name, 23);
         push_str (st->stack, C_STR, buf);
     }
@@ -3407,7 +3399,7 @@ int buildin_getequipname (struct script_state *st)
     struct item_data *item;
     char *buf;
 
-    buf = (char *) aCalloc (64, sizeof (char));
+    buf = (char *) calloc (64, 1);
     sd = script_rid2sd (st);
     num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
     i = pc_checkequip (sd, equip[num - 1]);
@@ -4208,7 +4200,7 @@ int buildin_gettimestr (struct script_state *st)
     fmtstr = conv_str (st, &(st->stack->stack_data[st->start + 2]));
     maxlen = conv_num (st, &(st->stack->stack_data[st->start + 3]));
 
-    tmpstr = (char *) aCalloc (maxlen + 1, sizeof (char));
+    tmpstr = (char *) calloc (maxlen + 1, 1);
     strftime (tmpstr, maxlen, fmtstr, gmtime (&now));
     tmpstr[maxlen] = '\0';
 
@@ -5773,7 +5765,7 @@ int buildin_getcastlename (struct script_state *st)
         {
             if (strcmp (mapname, gc->map_name) == 0)
             {
-                buf = (char *) aCalloc (24, sizeof (char));
+                buf = (char *) calloc (24, 1);
                 strncpy (buf, gc->castle_name, 23);
                 break;
             }
@@ -6451,7 +6443,7 @@ int buildin_getitemname (struct script_state *st)
         i_data = itemdb_search (item_id);
     }
 
-    item_name = (char *) aCalloc (24, sizeof (char));
+    item_name = (char *) calloc (24, 1);
     if (i_data)
         strncpy (item_name, i_data->jname, 23);
     else
@@ -7353,11 +7345,10 @@ void op_add (struct script_state *st)
     else
     {                           // ssの予定
         char *buf;
-        buf =
-            (char *)
-            aCalloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) +
-                     strlen (st->stack->stack_data[st->stack->sp].u.str) + 1,
-                     sizeof (char));
+        buf = (char *)
+            calloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) +
+                    strlen (st->stack->stack_data[st->stack->sp].u.str) + 1,
+                    1);
         strcpy (buf, st->stack->stack_data[st->stack->sp - 1].u.str);
         strcat (buf, st->stack->stack_data[st->stack->sp].u.str);
         if (st->stack->stack_data[st->stack->sp - 1].type == C_STR)
@@ -7772,9 +7763,8 @@ int run_script_main (unsigned char *script, int pos, int rid, int oid,
         {
             if (sd->npc_stackbuf)
                 free (sd->npc_stackbuf);
-            sd->npc_stackbuf =
-                (char *) aCalloc (sizeof (stack->stack_data[0]) *
-                                  stack->sp_max, sizeof (char));
+            sd->npc_stackbuf = (char *)
+                calloc (sizeof (stack->stack_data[0]) * stack->sp_max, 1);
             memcpy (sd->npc_stackbuf, stack->stack_data,
                     sizeof (stack->stack_data[0]) * stack->sp_max);
             sd->npc_stack = stack->sp;
@@ -7813,9 +7803,8 @@ int run_script_l (unsigned char *script, int pos, int rid, int oid,
         script = sd->npc_script;
         stack.sp = sd->npc_stack;
         stack.sp_max = sd->npc_stackmax;
-        stack.stack_data =
-            (struct script_data *) aCalloc (stack.sp_max,
-                                            sizeof (stack.stack_data[0]));
+        stack.stack_data = (struct script_data *)
+            calloc (stack.sp_max, sizeof (stack.stack_data[0]));
         memcpy (stack.stack_data, sd->npc_stackbuf,
                 sizeof (stack.stack_data[0]) * stack.sp_max);
         free (sd->npc_stackbuf);
@@ -7826,9 +7815,8 @@ int run_script_l (unsigned char *script, int pos, int rid, int oid,
         // スタック初期化
         stack.sp = 0;
         stack.sp_max = 64;
-        stack.stack_data =
-            (struct script_data *) aCalloc (stack.sp_max,
-                                            sizeof (stack.stack_data[0]));
+        stack.stack_data = (struct script_data *)
+            calloc (stack.sp_max, sizeof (stack.stack_data[0]));
     }
     st.stack = &stack;
     st.pos = pos;
@@ -7880,7 +7868,7 @@ int mapreg_setregstr (int num, const char *str)
         mapreg_dirty = 1;
         return 0;
     }
-    p = (char *) aCalloc (strlen (str) + 1, sizeof (char));
+    p = (char *) calloc (strlen (str) + 1, 1);
     strcpy (p, str);
     numdb_insert (mapregstr_db, num, p);
     mapreg_dirty = 1;
@@ -7913,7 +7901,7 @@ static int script_load_mapreg ()
                 printf ("%s: %s broken data !\n", mapreg_txt, buf1);
                 continue;
             }
-            p = (char *) aCalloc (strlen (buf2) + 1, sizeof (char));
+            p = (char *) calloc (strlen (buf2) + 1, 1);
             strcpy (p, buf2);
             s = add_str (buf1);
             numdb_insert (mapregstr_db, (i << 24) | s, p);
@@ -7938,10 +7926,10 @@ static int script_load_mapreg ()
  * 永続的マップ変数の書き込み
  *------------------------------------------
  */
-static int script_save_mapreg_intsub (void *key, void *data, va_list ap)
+static void script_save_mapreg_intsub (db_key_t key, db_val_t data, va_list ap)
 {
     FILE *fp = va_arg (ap, FILE *);
-    int  num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24;
+    int  num = key.i & 0x00ffffff, i = key.i >> 24;
     char *name = str_buf + str_data[num].str;
     if (name[1] != '@')
     {
@@ -7950,13 +7938,12 @@ static int script_save_mapreg_intsub (void *key, void *data, va_list ap)
         else
             fprintf (fp, "%s,%d\t%d\n", name, i, (int) data);
     }
-    return 0;
 }
 
-static int script_save_mapreg_strsub (void *key, void *data, va_list ap)
+static void script_save_mapreg_strsub (db_key_t key, db_val_t data, va_list ap)
 {
     FILE *fp = va_arg (ap, FILE *);
-    int  num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24;
+    int  num = key.i & 0x00ffffff, i = key.i >> 24;
     char *name = str_buf + str_data[num].str;
     if (name[1] != '@')
     {
@@ -7965,7 +7952,6 @@ static int script_save_mapreg_strsub (void *key, void *data, va_list ap)
         else
             fprintf (fp, "%s,%d\t%s\n", name, i, (char *) data);
     }
-    return 0;
 }
 
 static int script_save_mapreg ()
@@ -7982,12 +7968,11 @@ static int script_save_mapreg ()
     return 0;
 }
 
-static int script_autosave_mapreg (int tid, unsigned int tick, int id,
-                                   int data)
+static void script_autosave_mapreg (timer_id tid, tick_t tick, custom_id_t id,
+                                    custom_data_t data)
 {
     if (mapreg_dirty)
         script_save_mapreg ();
-    return 0;
 }
 
 /*==========================================
@@ -8043,11 +8028,11 @@ int script_config_read (char *cfgName)
         i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2);
         if (i != 2)
             continue;
-        if (strcmpi (w1, "refine_posword") == 0)
+        if (strcasecmp (w1, "refine_posword") == 0)
         {
             set_posword (w2);
         }
-        if (strcmpi (w1, "import") == 0)
+        if (strcasecmp (w1, "import") == 0)
         {
             script_config_read (w2);
         }
@@ -8061,27 +8046,16 @@ int script_config_read (char *cfgName)
  * 終了
  *------------------------------------------
  */
-static int mapreg_db_final (void *key, void *data, va_list ap)
-{
-    return 0;
-}
 
-static int mapregstr_db_final (void *key, void *data, va_list ap)
+static void mapregstr_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     free (data);
-    return 0;
-}
-
-static int scriptlabel_db_final (void *key, void *data, va_list ap)
-{
-    return 0;
 }
 
-static int userfunc_db_final (void *key, void *data, va_list ap)
+static void userfunc_db_final (db_key_t key, db_val_t data, va_list ap)
 {
-    free (key);
+    free ((char*)key.s);
     free (data);
-    return 0;
 }
 
 int do_final_script ()
@@ -8092,11 +8066,11 @@ int do_final_script ()
         free (script_buf);
 
     if (mapreg_db)
-        numdb_final (mapreg_db, mapreg_db_final);
+        numdb_final (mapreg_db, NULL);
     if (mapregstr_db)
         strdb_final (mapregstr_db, mapregstr_db_final);
     if (scriptlabel_db)
-        strdb_final (scriptlabel_db, scriptlabel_db_final);
+        strdb_final (scriptlabel_db, NULL);
     if (userfunc_db)
         strdb_final (userfunc_db, userfunc_db_final);
 
@@ -8118,7 +8092,6 @@ int do_init_script ()
     mapregstr_db = numdb_init ();
     script_load_mapreg ();
 
-    add_timer_func_list (script_autosave_mapreg, "script_autosave_mapreg");
     add_timer_interval (gettick () + MAPREG_AUTOSAVE_INTERVAL,
                         script_autosave_mapreg, 0, 0,
                         MAPREG_AUTOSAVE_INTERVAL);
diff --git a/src/map/skill-pools.c b/src/map/skill-pools.c
index 50dafcb..0c91360 100644
--- a/src/map/skill-pools.c
+++ b/src/map/skill-pools.c
@@ -5,7 +5,7 @@
 
 #include "../common/timer.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
 #include "magic.h"
 
 #include "battle.h"
diff --git a/src/map/skill.c b/src/map/skill.c
index 54ff545..d8b64e8 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -8,7 +8,7 @@
 
 #include "../common/timer.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
 #include "magic.h"
 
 #include "battle.h"
@@ -2250,7 +2250,7 @@ int skill_area_sub_count (struct block_list *src, struct block_list *target,
  *
  *------------------------------------------
  */
-static int skill_timerskill (int tid, unsigned int tick, int id, int data)
+static void skill_timerskill (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = NULL;
     struct mob_data *md = NULL;
@@ -2258,26 +2258,26 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
     struct skill_timerskill *skl = NULL;
     int  range;
 
-    nullpo_retr (0, src);
+    nullpo_retv (src);
 
     if (src->prev == NULL)
-        return 0;
+        return;
 
     if (src->type == BL_PC)
     {
-        nullpo_retr (0, sd = (struct map_session_data *) src);
+        nullpo_retv (sd = (struct map_session_data *) src);
         skl = &sd->skilltimerskill[data];
     }
     else if (src->type == BL_MOB)
     {
-        nullpo_retr (0, md = (struct mob_data *) src);
+        nullpo_retv (md = (struct mob_data *) src);
         skl = &md->skilltimerskill[data];
     }
 
     else
-        return 0;
+        return;
 
-    nullpo_retr (0, skl);
+    nullpo_retv (skl);
 
     skl->timer = -1;
     if (skl->target_id)
@@ -2295,17 +2295,17 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
             }
         }
         if (target == NULL)
-            return 0;
+            return;
         if (target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
-            return 0;
+            return;
         if (src->m != target->m)
-            return 0;
+            return;
         if (sd && pc_isdead (sd))
-            return 0;
+            return;
         if (target->type == BL_PC
             && pc_isdead ((struct map_session_data *) target)
             && skl->skill_id != RG_INTIMIDATE)
-            return 0;
+            return;
 
         switch (skl->skill_id)
         {
@@ -2392,7 +2392,7 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
     else
     {
         if (src->m != skl->map)
-            return 0;
+            return;
         switch (skl->skill_id)
         {
             case WZ_METEOR:
@@ -2410,8 +2410,6 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
                 break;
         }
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -5145,19 +5143,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
  * スキル使用(詠唱完了、ID指定)
  *------------------------------------------
  */
-int skill_castend_id (int tid, unsigned int tick, int id, int data)
+void skill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
     struct block_list *bl;
     int  range, inf2;
 
-    nullpo_retr (0, sd);
+    nullpo_retv ( sd);
 
     if (sd->bl.prev == NULL)    //prevが無いのはありなの?
-        return 0;
+        return;
 
     if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid)  /* タイマIDの確認 */
-        return 0;
+        return;
     if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1
         && pc_checkskill (sd, SA_FREECAST) > 0)
     {
@@ -5172,14 +5170,14 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
     if (sd->bl.m != bl->m || pc_isdead (sd))
     {                           //マップが違うか自分が死んでいる
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
 
     if (sd->skillid == PR_LEXAETERNA)
@@ -5194,7 +5192,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
             sd->skillitem = sd->skillitemlv = -1;
-            return 0;
+            return;
         }
     }
     else if (sd->skillid == RG_BACKSTAP)
@@ -5208,7 +5206,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
             sd->skillitem = sd->skillitemlv = -1;
-            return 0;
+            return;
         }
     }
 
@@ -5219,7 +5217,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
     if (inf2 & 0xC00 && sd->bl.id != bl->id)
     {
@@ -5235,7 +5233,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
             sd->skillitem = sd->skillitemlv = -1;
-            return 0;
+            return;
         }
     }
 
@@ -5261,7 +5259,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
             sd->skillitem = sd->skillitemlv = -1;
-            return 0;
+            return;
         }
     }
     if (!skill_check_condition (sd, 1))
@@ -5269,7 +5267,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
     sd->skillitem = sd->skillitemlv = -1;
     if (battle_config.skill_out_range_consume)
@@ -5279,7 +5277,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
             clif_skill_fail (sd, sd->skillid, 0, 0);
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
-            return 0;
+            return;
         }
     }
 
@@ -5308,8 +5306,6 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
                                            sd->skilllv, tick, 0);
             break;
     }
-
-    return 0;
 }
 
 /*==========================================
@@ -5631,7 +5627,7 @@ int skill_castend_map (struct map_session_data *sd, int skill_num,
                  skill_unitsetting (&sd->bl, sd->skillid, sd->skilllv,
                                     sd->skillx, sd->skilly, 0)) == NULL)
                 return 0;
-            group->valstr = (char *) aCalloc (24, sizeof (char));
+            CREATE (group->valstr, char, 24);
             memcpy (group->valstr, map, 24);
             group->val2 = (x << 16) | y;
         }
@@ -7001,17 +6997,17 @@ int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl,
  * スキル使用(詠唱完了、場所指定)
  *------------------------------------------
  */
-int skill_castend_pos (int tid, unsigned int tick, int id, int data)
+void skill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
     int  range, maxcount;
 
-    nullpo_retr (0, sd);
+    nullpo_retv (sd);
 
     if (sd->bl.prev == NULL)
-        return 0;
+        return;
     if (sd->skilltimer != tid)  /* タイマIDの確認 */
-        return 0;
+        return;
     if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) > 0)
     {
         sd->speed = sd->prev_speed;
@@ -7023,7 +7019,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
 
     if (battle_config.pc_skill_reiteration == 0)
@@ -7061,7 +7057,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
                 sd->canact_tick = tick;
                 sd->canmove_tick = tick;
                 sd->skillitem = sd->skillitemlv = -1;
-                return 0;
+                return;
             }
         }
     }
@@ -7098,7 +7094,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
                 sd->canact_tick = tick;
                 sd->canmove_tick = tick;
                 sd->skillitem = sd->skillitemlv = -1;
-                return 0;
+                return;
             }
         }
     }
@@ -7121,7 +7117,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
                 sd->canact_tick = tick;
                 sd->canmove_tick = tick;
                 sd->skillitem = sd->skillitemlv = -1;
-                return 0;
+                return;
             }
         }
     }
@@ -7138,7 +7134,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
             sd->skillitem = sd->skillitemlv = -1;
-            return 0;
+            return;
         }
     }
     if (!skill_check_condition (sd, 1))
@@ -7146,7 +7142,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
         sd->canact_tick = tick;
         sd->canmove_tick = tick;
         sd->skillitem = sd->skillitemlv = -1;
-        return 0;
+        return;
     }
     sd->skillitem = sd->skillitemlv = -1;
     if (battle_config.skill_out_range_consume)
@@ -7156,7 +7152,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
             clif_skill_fail (sd, sd->skillid, 0, 0);
             sd->canact_tick = tick;
             sd->canmove_tick = tick;
-            return 0;
+            return;
         }
     }
 
@@ -7166,8 +7162,6 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
 
     skill_castend_pos2 (&sd->bl, sd->skillx, sd->skilly, sd->skillid,
                         sd->skilllv, tick, 0);
-
-    return 0;
 }
 
 /*==========================================
@@ -7338,8 +7332,11 @@ static int skill_check_condition_mob_master_sub (struct block_list *bl,
     nullpo_retr (0, bl);
     nullpo_retr (0, ap);
     nullpo_retr (0, md = (struct mob_data *) bl);
-    nullpo_retr (0, src_id = va_arg (ap, int));
-    nullpo_retr (0, mob_class = va_arg (ap, int));
+
+    if (!(src_id = va_arg (ap, int)))
+        return 0;
+    if (!(mob_class = va_arg (ap, int)))
+        return 0;
     nullpo_retr (0, c = va_arg (ap, int *));
 
     if (md->class == mob_class && md->master_id == src_id)
@@ -8418,7 +8415,6 @@ int skill_use_pos (struct map_session_data *sd,
 int skill_castcancel (struct block_list *bl, int type)
 {
     int  inf;
-    int  ret = 0;
 
     nullpo_retr (0, bl);
 
@@ -8439,22 +8435,16 @@ int skill_castcancel (struct block_list *bl, int type)
             if (!type)
             {
                 if ((inf = skill_get_inf (sd->skillid)) == 2 || inf == 32)
-                    ret = delete_timer (sd->skilltimer, skill_castend_pos);
+                    delete_timer (sd->skilltimer, skill_castend_pos);
                 else
-                    ret = delete_timer (sd->skilltimer, skill_castend_id);
-                if (ret < 0)
-                    printf ("delete timer error : skillid : %d\n",
-                            sd->skillid);
+                    delete_timer (sd->skilltimer, skill_castend_id);
             }
             else
             {
                 if ((inf = skill_get_inf (sd->skillid_old)) == 2 || inf == 32)
-                    ret = delete_timer (sd->skilltimer, skill_castend_pos);
+                    delete_timer (sd->skilltimer, skill_castend_pos);
                 else
-                    ret = delete_timer (sd->skilltimer, skill_castend_id);
-                if (ret < 0)
-                    printf ("delete timer error : skillid : %d\n",
-                            sd->skillid_old);
+                    delete_timer (sd->skilltimer, skill_castend_id);
             }
             sd->skilltimer = -1;
             clif_skillcastcancel (bl);
@@ -8469,14 +8459,12 @@ int skill_castcancel (struct block_list *bl, int type)
         if (md->skilltimer != -1)
         {
             if ((inf = skill_get_inf (md->skillid)) == 2 || inf == 32)
-                ret = delete_timer (md->skilltimer, mobskill_castend_pos);
+                delete_timer (md->skilltimer, mobskill_castend_pos);
             else
-                ret = delete_timer (md->skilltimer, mobskill_castend_id);
+                delete_timer (md->skilltimer, mobskill_castend_id);
             md->skilltimer = -1;
             clif_skillcastcancel (bl);
         }
-        if (ret < 0)
-            printf ("delete timer error : skillid : %d\n", md->skillid);
         return 0;
     }
     return 1;
@@ -9496,7 +9484,7 @@ int skill_update_heal_animation (struct map_session_data *sd)
  * ステータス異常終了タイマー
  *------------------------------------------
  */
-int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
+void skill_status_change_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     int  type = data;
     struct block_list *bl;
@@ -9505,8 +9493,8 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
     //short *sc_count; //使ってない?
 
     if ((bl = map_id2bl (id)) == NULL)
-        return 0;               //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
-    nullpo_retr (0, sc_data = battle_get_sc_data (bl));
+        return;               //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
+    nullpo_retv (sc_data = battle_get_sc_data (bl));
 
     if (bl->type == BL_PC)
         sd = (struct map_session_data *) bl;
@@ -9543,7 +9531,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
             break;
@@ -9562,7 +9550,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         1000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
             break;
@@ -9581,7 +9569,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                     250 + tick,
                                                     skill_status_change_timer,
                                                     bl->id, data);
-                return 0;
+                return;
             }
         }
             break;
@@ -9599,7 +9587,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                     250 + tick,
                                                     skill_status_change_timer,
                                                     bl->id, data);
-                return 0;
+                return;
             }
         }
             break;
@@ -9613,7 +9601,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (1000 * 600 + tick, skill_status_change_timer,
                                bl->id, data);
-                return 0;
+                return;
             }
         }
             break;
@@ -9626,7 +9614,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (1000 + tick, skill_status_change_timer, bl->id,
                                data);
-                return 0;
+                return;
             }
             break;
 
@@ -9642,7 +9630,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (150 + tick, skill_status_change_timer, bl->id,
                                data);
-                return 0;
+                return;
             }
         }
             break;
@@ -9654,7 +9642,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                     add_timer (1000 * 600 + tick, skill_status_change_timer,
                                bl->id, data);
                 sc_data[type].val2 = 1;
-                return 0;
+                return;
             }
             break;
 
@@ -9678,7 +9666,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                (unit->group->skill_id,
                                 unit->group->skill_lv) + tick,
                                skill_status_change_timer, bl->id, data);
-                return 0;
+                return;
             }
             break;
 
@@ -9697,7 +9685,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                (unit->group->skill_id,
                                 unit->group->skill_lv) / 10 + tick,
                                skill_status_change_timer, bl->id, data);
-                return 0;
+                return;
             }
             break;
 
@@ -9716,7 +9704,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (1000 + tick, skill_status_change_timer, bl->id,
                                data);
-                return 0;
+                return;
             }
             else if ((--sc_data[type].val3) > 0)
             {
@@ -9740,7 +9728,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (1000 + tick, skill_status_change_timer, bl->id,
                                data);
-                return 0;
+                return;
             }
             break;
         case SC_POISON:
@@ -9796,7 +9784,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         10000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
                 if (sd->status.max_hp <= sd->status.hp)
                     skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1);
@@ -9819,7 +9807,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                 sc_data[type].timer =
                     add_timer (1000 * 600 + tick, skill_status_change_timer,
                                bl->id, data);
-            return 0;
+            return;
 
         case SC_DANCING:       //ダンススキルの時間SP消費
         {
@@ -9869,7 +9857,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         1000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
         }
@@ -9885,7 +9873,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         15000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
             break;
@@ -9899,7 +9887,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         10000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
             break;
@@ -9916,7 +9904,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                         60000 + tick,
                                                         skill_status_change_timer,
                                                         bl->id, data);
-                    return 0;
+                    return;
                 }
             }
             break;
@@ -9934,7 +9922,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
                                                     1000 + tick,
                                                     skill_status_change_timer,
                                                     bl->id, data);
-                return 0;
+                return;
             }
             break;
 
@@ -9944,7 +9932,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
 
     }
 
-    return skill_status_change_end (bl, type, tid);
+    skill_status_change_end (bl, type, tid);
 }
 
 /*==========================================
@@ -11153,8 +11141,7 @@ struct skill_unit_group *skill_initunitgroup (struct block_list *src,
     group->group_id = skill_unit_group_newid++;
     if (skill_unit_group_newid <= 0)
         skill_unit_group_newid = 10;
-    group->unit =
-        (struct skill_unit *) aCalloc (count, sizeof (struct skill_unit));
+    CREATE (group->unit, struct skill_unit, count);
     group->unit_count = count;
     group->val1 = group->val2 = 0;
     group->skill_id = skillid;
@@ -11493,15 +11480,13 @@ int skill_unit_timer_sub (struct block_list *bl, va_list ap)
  * スキルユニットタイマー処理
  *------------------------------------------
  */
-int skill_unit_timer (int tid, unsigned int tick, int id, int data)
+void skill_unit_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
 {
     map_freeblock_lock ();
 
     map_foreachobject (skill_unit_timer_sub, BL_SKILL, tick);
 
     map_freeblock_unlock ();
-
-    return 0;
 }
 
 /*==========================================
@@ -11814,19 +11799,19 @@ int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx,
 
 static int scan_stat (char *statname)
 {
-    if (!strcmpi (statname, "str"))
+    if (!strcasecmp (statname, "str"))
         return SP_STR;
-    if (!strcmpi (statname, "dex"))
+    if (!strcasecmp (statname, "dex"))
         return SP_DEX;
-    if (!strcmpi (statname, "agi"))
+    if (!strcasecmp (statname, "agi"))
         return SP_AGI;
-    if (!strcmpi (statname, "vit"))
+    if (!strcasecmp (statname, "vit"))
         return SP_VIT;
-    if (!strcmpi (statname, "int"))
+    if (!strcasecmp (statname, "int"))
         return SP_INT;
-    if (!strcmpi (statname, "luk"))
+    if (!strcasecmp (statname, "luk"))
         return SP_LUK;
-    if (!strcmpi (statname, "none"))
+    if (!strcasecmp (statname, "none"))
         return 0;
 
     else
@@ -11911,18 +11896,18 @@ int skill_readdb (void)
             skill_db[i].num[k] =
                 (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
 
-        if (strcmpi (split[9], "yes") == 0)
+        if (strcasecmp (split[9], "yes") == 0)
             skill_db[i].castcancel = 1;
         else
             skill_db[i].castcancel = 0;
         skill_db[i].cast_def_rate = atoi (split[9]);
         skill_db[i].inf2 = atoi (split[10]);
         skill_db[i].maxcount = atoi (split[11]);
-        if (strcmpi (split[13], "weapon") == 0)
+        if (strcasecmp (split[13], "weapon") == 0)
             skill_db[i].skill_type = BF_WEAPON;
-        else if (strcmpi (split[12], "magic") == 0)
+        else if (strcasecmp (split[12], "magic") == 0)
             skill_db[i].skill_type = BF_MAGIC;
-        else if (strcmpi (split[12], "misc") == 0)
+        else if (strcasecmp (split[12], "misc") == 0)
             skill_db[i].skill_type = BF_MISC;
         else
             skill_db[i].skill_type = 0;
@@ -11938,12 +11923,12 @@ int skill_readdb (void)
             skill_db[i].blewcount[k] =
                 (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
 
-        if (!strcmpi (split[15], "passive"))
+        if (!strcasecmp (split[15], "passive"))
         {
             skill_pool_register (i);
             skill_db[i].poolflags = SKILL_POOL_FLAG;
         }
-        else if (!strcmpi (split[15], "active"))
+        else if (!strcasecmp (split[15], "active"))
         {
             skill_pool_register (i);
             skill_db[i].poolflags = SKILL_POOL_FLAG | SKILL_POOL_ACTIVE;
@@ -12086,29 +12071,29 @@ int skill_readdb (void)
                 skill_db[i].weapon |= 1 << l;
         }
 
-        if (strcmpi (split[8], "hiding") == 0)
+        if (strcasecmp (split[8], "hiding") == 0)
             skill_db[i].state = ST_HIDING;
-        else if (strcmpi (split[8], "cloaking") == 0)
+        else if (strcasecmp (split[8], "cloaking") == 0)
             skill_db[i].state = ST_CLOAKING;
-        else if (strcmpi (split[8], "hidden") == 0)
+        else if (strcasecmp (split[8], "hidden") == 0)
             skill_db[i].state = ST_HIDDEN;
-        else if (strcmpi (split[8], "riding") == 0)
+        else if (strcasecmp (split[8], "riding") == 0)
             skill_db[i].state = ST_RIDING;
-        else if (strcmpi (split[8], "falcon") == 0)
+        else if (strcasecmp (split[8], "falcon") == 0)
             skill_db[i].state = ST_FALCON;
-        else if (strcmpi (split[8], "cart") == 0)
+        else if (strcasecmp (split[8], "cart") == 0)
             skill_db[i].state = ST_CART;
-        else if (strcmpi (split[8], "shield") == 0)
+        else if (strcasecmp (split[8], "shield") == 0)
             skill_db[i].state = ST_SHIELD;
-        else if (strcmpi (split[8], "sight") == 0)
+        else if (strcasecmp (split[8], "sight") == 0)
             skill_db[i].state = ST_SIGHT;
-        else if (strcmpi (split[8], "explosionspirits") == 0)
+        else if (strcasecmp (split[8], "explosionspirits") == 0)
             skill_db[i].state = ST_EXPLOSIONSPIRITS;
-        else if (strcmpi (split[8], "recover_weight_rate") == 0)
+        else if (strcasecmp (split[8], "recover_weight_rate") == 0)
             skill_db[i].state = ST_RECOV_WEIGHT_RATE;
-        else if (strcmpi (split[8], "move_enable") == 0)
+        else if (strcasecmp (split[8], "move_enable") == 0)
             skill_db[i].state = ST_MOVE_ENABLE;
-        else if (strcmpi (split[8], "water") == 0)
+        else if (strcasecmp (split[8], "water") == 0)
             skill_db[i].state = ST_WATER;
         else
             skill_db[i].state = ST_NONE;
@@ -12275,10 +12260,10 @@ int skill_readdb (void)
 void skill_reload (void)
 {
     /*
-     * 
+     *
      * <empty skill database>
      * <?>
-     * 
+     *
      */
 
     do_init_skill ();
@@ -12292,12 +12277,6 @@ int do_init_skill (void)
 {
     skill_readdb ();
 
-    add_timer_func_list (skill_unit_timer, "skill_unit_timer");
-    add_timer_func_list (skill_castend_id, "skill_castend_id");
-    add_timer_func_list (skill_castend_pos, "skill_castend_pos");
-    add_timer_func_list (skill_timerskill, "skill_timerskill");
-    add_timer_func_list (skill_status_change_timer,
-                         "skill_status_change_timer");
     add_timer_interval (gettick () + SKILLUNITTIMER_INVERVAL,
                         skill_unit_timer, 0, 0, SKILLUNITTIMER_INVERVAL);
 
diff --git a/src/map/skill.h b/src/map/skill.h
index 08f2e18..d0a698c 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -2,6 +2,8 @@
 #ifndef _SKILL_H_
 #define _SKILL_H_
 
+#include "../common/timer.h"
+
 #include "map.h"
 #include "magic.h"
 
@@ -149,7 +151,7 @@ int  skill_status_effect (struct block_list *bl, int type, int val1, int val2,
 int  skill_status_change_start (struct block_list *bl, int type, int val1,
                                 int val2, int val3, int val4, int tick,
                                 int flag);
-int  skill_status_change_timer (int tid, unsigned int tick, int id, int data);
+void skill_status_change_timer (timer_id, tick_t, custom_id_t, custom_data_t);
 int  skill_status_change_active (struct block_list *bl, int type);  // [fate]
 int  skill_encchant_eremental_end (struct block_list *bl, int type);
 int  skill_status_change_end (struct block_list *bl, int type, int tid);
diff --git a/src/map/storage.c b/src/map/storage.c
index 84dedb3..4a0d934 100644
--- a/src/map/storage.c
+++ b/src/map/storage.c
@@ -7,7 +7,6 @@
 
 #include "../common/db.h"
 #include "../common/nullpo.h"
-#include "../common/malloc.h"
 
 #include "storage.h"
 #include "chrif.h"
@@ -40,18 +39,16 @@ int storage_comp_item (const void *_i1, const void *_i2)
     return i1->nameid - i2->nameid;
 }
 
-static int guild_storage_db_final (void *key, void *data, va_list ap)
+static void guild_storage_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct guild_storage *gstor = (struct guild_storage *) data;
     free (gstor);
-    return 0;
 }
 
-static int storage_db_final (void *key, void *data, va_list ap)
+static void storage_db_final (db_key_t key, db_val_t data, va_list ap)
 {
     struct storage *stor = (struct storage *) data;
     free (stor);
-    return 0;
 }
 
 void sortage_sortitem (struct storage *stor)
@@ -87,7 +84,7 @@ void do_final_storage (void)    // by [MC Cameri]
         numdb_final (guild_storage_db, guild_storage_db_final);
 }
 
-static int storage_reconnect_sub (void *key, void *data, va_list ap)
+static void storage_reconnect_sub (db_key_t key, db_val_t data, va_list ap)
 {                               //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex]
     int  type = va_arg (ap, int);
     if (type)
@@ -102,7 +99,6 @@ static int storage_reconnect_sub (void *key, void *data, va_list ap)
         if (stor->dirty && stor->storage_status == 0)   //Save closed storages.
             storage_storage_save (stor->account_id, stor->dirty == 2 ? 1 : 0);
     }
-    return 0;
 }
 
 //Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex
@@ -118,7 +114,7 @@ struct storage *account2storage (int account_id)
         (struct storage *) numdb_search (storage_db, account_id);
     if (stor == NULL)
     {
-        stor = (struct storage *) aCallocA (sizeof (struct storage), 1);
+        CREATE (stor, struct storage, 1);
         stor->account_id = account_id;
         numdb_insert (storage_db, stor->account_id, stor);
     }
@@ -481,13 +477,7 @@ struct guild_storage *guild2storage (int guild_id)
                                                     guild_id);
         if (gs == NULL)
         {
-            gs = (struct guild_storage *)
-                aCallocA (sizeof (struct guild_storage), 1);
-            if (gs == NULL)
-            {
-                printf ("storage: out of memory!\n");
-                exit (0);
-            }
+            CREATE (gs, struct guild_storage, 1);
             gs->guild_id = guild_id;
             numdb_insert (guild_storage_db, gs->guild_id, gs);
         }
diff --git a/src/map/tmw.c b/src/map/tmw.c
index c04c9c8..3487c1d 100644
--- a/src/map/tmw.c
+++ b/src/map/tmw.c
@@ -8,7 +8,6 @@
 
 #include "../common/socket.h"
 #include "../common/timer.h"
-#include "../common/malloc.h"
 #include "../common/version.h"
 #include "../common/nullpo.h"
 
@@ -30,7 +29,7 @@
 #include "skill.h"
 #include "storage.h"
 #include "trade.h"
-    
+
 int tmw_CheckChatSpam (struct map_session_data *sd, char *message)
 {
     nullpo_retr (1, sd);
diff --git a/src/tool/Makefile b/src/tool/Makefile
index 87393fb..8d51c25 100644
--- a/src/tool/Makefile
+++ b/src/tool/Makefile
@@ -1,15 +1,13 @@
 include ../../make.defs
 
-COBJS=../common/timer.o ../common/malloc.o ../common/socket.o ../common/lock.o ../common/db.o ../char/int_storage.o ../char/inter.o ../char/int_party.o ../char/int_guild.o
-MOBJS=../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../char/int_guild.o ../char/int_party.o ../char/int_storage.o ../char/inter.o
+OBJS =../common/timer.o ../common/socket.o ../common/db.o ../common/lock.o ../char/inter.o ../char/int_guild.o ../char/int_party.o ../char/int_storage.o
 all:	adduser itemfrob mapfrob marriage-info eathena-monitor
 adduser: adduser.o ../common/socket.o
 
-itemfrob: itemfrob.o ${COBJS}
-mapfrob: mapfrob.o ${COBJS}
-marriage-info: marriage-info.o ${MOBJS}
+itemfrob: itemfrob.o ${OBJS}
+mapfrob: mapfrob.o ${OBJS}
+marriage-info: marriage-info.o ${OBJS}
 eathena-monitor: eathena-monitor.c
-	$(CC) $(CFLAGS) -o eathena-monitor eathena-monitor.c
 
 clean:
 	rm -f adduser itemfrob mapfrob marriage-info eathena-monitor
diff --git a/src/tool/eathena-monitor.c b/src/tool/eathena-monitor.c
index 04a48cf..6e26706 100644
--- a/src/tool/eathena-monitor.c
+++ b/src/tool/eathena-monitor.c
@@ -27,7 +27,7 @@
 
 
 #define SKIP_BLANK(ptr) ptr += skip_blank(ptr)
-inline size_t skip_blank(const char* ptr) {
+static inline size_t skip_blank(const char* ptr) {
     size_t i = 0;
     while (
         (ptr[i] == ' ') ||
@@ -39,7 +39,7 @@ inline size_t skip_blank(const char* ptr) {
 }
 
 #define GOTO_EQL(ptr) ptr += goto_eql(ptr)
-inline size_t goto_eql(const char* ptr) {
+static inline size_t goto_eql(const char* ptr) {
     size_t i = 0;
     while (
         (ptr[i] != '\0') &&
@@ -51,7 +51,7 @@ inline size_t goto_eql(const char* ptr) {
 }
 
 #define GOTO_EOL(ptr) ptr += goto_newline(ptr)
-inline size_t goto_newline(const char* ptr) {
+static inline size_t goto_newline(const char* ptr) {
     size_t i = 0;
     while (
         (ptr[i] != '\0') &&
diff --git a/src/tool/itemfrob.c b/src/tool/itemfrob.c
index bc9ff35..646ec73 100644
--- a/src/tool/itemfrob.c
+++ b/src/tool/itemfrob.c
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "../common/mmo.h"
+// Yes, this is intentional
 #include "../char/char.c"
 
 // Well, this is not terribly elegant, but I don't have that much time.
@@ -37,7 +38,6 @@ int mmo_char_convert ()
             fprintf (ofp, "%s" RETCODE, line);
         }
     }
-    fcloseall ();
     return 0;
 }
 
@@ -128,8 +128,3 @@ int main (int argc, char *argv[])
 
     return 0;
 }
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};
diff --git a/src/tool/mapfrob.c b/src/tool/mapfrob.c
index d410878..11983eb 100644
--- a/src/tool/mapfrob.c
+++ b/src/tool/mapfrob.c
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "../common/mmo.h"
+// Yes, this is intentional
 #include "../char/char.c"
 
 // Well, this is not terribly elegant, but I don't have that much time.
@@ -63,7 +64,6 @@ int mmo_char_convert ()
             fprintf (ofp, "%s" RETCODE, line);
         }
     }
-    fcloseall ();
     return 0;
 }
 
@@ -127,8 +127,3 @@ int main (int argc, char *argv[])
 
     return 0;
 }
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};
diff --git a/src/tool/marriage-info.c b/src/tool/marriage-info.c
index 9b91955..4d7cbc3 100644
--- a/src/tool/marriage-info.c
+++ b/src/tool/marriage-info.c
@@ -9,6 +9,7 @@ src/char/int_party.o src/char/int_storage.o src/char/inter.o
 #include <stdlib.h>
 #include "../login/login.h"
 #include "../common/mmo.h"
+// Yes, this is intentional
 #include "../char/char.c"
 
 int mode;
@@ -442,7 +443,6 @@ int mmo_char_dump()
                         mmo_check_dumpworthy(&char_dat);
                 }
         }
-        fcloseall();
         return 0;
 }
 
@@ -480,7 +480,3 @@ int main(int argc,char *argv[])
 
 	return 0;
 }
-
-
-/* satisfy linker */
-void set_termfunc(void (*termfunc)(void)) {};
diff --git a/src/tool/moneycount/mmo.h b/src/tool/moneycount/mmo.h
index 640065a..c7ab21f 100644
--- a/src/tool/moneycount/mmo.h
+++ b/src/tool/moneycount/mmo.h
@@ -310,20 +310,5 @@ enum
 
 };
 
-#ifndef LCCWIN32
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-#endif
-
 #endif // _MMO_H_
 
diff --git a/src/tool/skillfrob.c b/src/tool/skillfrob.c
index ea68660..c7b6bb6 100644
--- a/src/tool/skillfrob.c
+++ b/src/tool/skillfrob.c
@@ -78,8 +78,3 @@ int main (int argc, char *argv[])
 
     return 0;
 }
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};
-- 
cgit v1.2.3-70-g09d2