From 3c4383b325ef940cfec25da86f8b087fd41ed29f Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Mon, 10 Jun 2013 00:42:08 +0100
Subject: [PATCH] [Change] Cleaned up the ai lua wrappers a bit, needs plenty
 more work.

---
 scripts/ai/empire.lua   | 10 +++----
 scripts/ai/merchant.lua | 10 +++----
 scripts/ai/militia.lua  |  4 +--
 scripts/ai/pirate.lua   |  6 ++--
 src/ai.c                | 66 ++++++++++-------------------------------
 src/lluadef.h           |  5 ++++
 6 files changed, 35 insertions(+), 66 deletions(-)

diff --git a/scripts/ai/empire.lua b/scripts/ai/empire.lua
index e2edab0..7cfe3d7 100644
--- a/scripts/ai/empire.lua
+++ b/scripts/ai/empire.lua
@@ -34,16 +34,16 @@ function attacked(attacker)
 end
 
 function create()
- if ai.rnd(0,2)==0 then -- More money, but less often.
-  ai.setcredits(ai.rnd(1000, ai.shipprice()/70))
+ if rnd.int(0,2)==0 then -- More money, but less often.
+  ai.setcredits(rnd.int(1000, ai.shipprice()/70))
  end
- if ai.rnd(0,2)==0 then
+ if rnd.int(0,2)==0 then
   ai.broadcast("The Empire is watching")
  end
 end
 
 function taunt(target)
- num = ai.rnd(0,4)
+ num = rnd.int(0,4)
  if num == 0 then msg = "How dare you attack me!?"
  elseif num == 1 then msg = "You can not defeat the Empire!"
  elseif num == 2 then msg = "You will hang for this!"
@@ -94,7 +94,7 @@ function stop()
  if ai.isstopped() then
   ai.stop()
   ai.poptask()
-  ai.settimer(0, ai.rnd(8000, 15000))
+  ai.settimer(0, rnd.int(8000, 15000))
   ai.pushtask(0, "land")
  else
   ai.brake()
diff --git a/scripts/ai/merchant.lua b/scripts/ai/merchant.lua
index 08ff373..4148668 100644
--- a/scripts/ai/merchant.lua
+++ b/scripts/ai/merchant.lua
@@ -25,7 +25,7 @@ end
 function attacked(attacker)
   if ai.taskname() ~= "runaway" then
     -- Let's have some messages.
-    num = ai.rnd(0,3)
+    num = rnd.int(0,3)
     if num == 0 then msg = "Mayday! We are under attack!"
     elseif num == 1 then msg = "Requesting assistance! Some scoundral is attacking us!"
     elseif num == 2 then msg = "Merchant vessle under attack here! HALP!"
@@ -41,9 +41,9 @@ function attacked(attacker)
 end
 
 function create()
-  ai.setcredits(ai.rnd(200, ai.shipprice()/100))
+  ai.setcredits(rnd.int(200, ai.shipprice()/100))
 
-  num = ai.rnd(12)
+  num = rnd.int(12)
   if num < 5 then
     cargo = "Food"
   elseif num < 8 then
@@ -55,7 +55,7 @@ function create()
   else
     cargo = "Medicine"
   end
-  ai.setcargo(cargo, ai.rnd(0, ai.cargofree()))
+  ai.setcargo(cargo, rnd.int(0, ai.cargofree()))
 end
 
 -- Runs away.
@@ -99,7 +99,7 @@ function stop()
   if ai.isstopped() then
   ai.stop()
     ai.poptask()
-    ai.settimer(0, ai.rnd(8000, 15000))
+    ai.settimer(0, rnd.int(8000, 15000))
     ai.pushtask(0, "land")
  else
   ai.brake()
diff --git a/scripts/ai/militia.lua b/scripts/ai/militia.lua
index 7a1d1d9..3234695 100644
--- a/scripts/ai/militia.lua
+++ b/scripts/ai/militia.lua
@@ -32,8 +32,8 @@ function attacked(attacker)
 end
 
 function create()
- ai.setcredits(ai.rnd(1000, ai.shipprice()/200))
- if ai.rnd(0, 2)==0 then
+ ai.setcredits(rnd.int(1000, ai.shipprice()/200))
+ if rnd.int(0, 2)==0 then
   ai.broadcast("This area is under militia survellance.")
   end
 end
diff --git a/scripts/ai/pirate.lua b/scripts/ai/pirate.lua
index e03e66b..96e8de0 100644
--- a/scripts/ai/pirate.lua
+++ b/scripts/ai/pirate.lua
@@ -20,7 +20,7 @@ function control()
     enemy = ai.getenemy()
     if ai.parmour() == 100 and enemy ~= 0 then
       -- Taunts.
-      num = ai.rnd(0,4)
+      num = rnd.int(0,4)
       if num == 0 then msg = "Prepare to be boarded!"
       elseif num == 1 then msg = "Whoa! Lookie what we found here!"
       elseif num == 2 then msg = "What's a ship like you doing in a place like this?"
@@ -57,13 +57,13 @@ function attacked(attacker)
 end
 
 function create()
- if ai.rnd(0,5) ~= 0 then
+ if rnd.int(0,5) ~= 0 then
   ai.setcredits(0, ai.shipprice()/300)
  end
 end
 
 function taunt(target)
-  num = ai.rnd(0,4)
+  num = rnd.int(0,4)
   if num == 0 then msg = "How dare you attack me?!"
   elseif num == 1 then msg = "Aha! You think you can best ME?!"
   elseif num == 2 then msg = "JUST! DIE!"
diff --git a/src/ai.c b/src/ai.c
index d863278..a24ed43 100644
--- a/src/ai.c
+++ b/src/ai.c
@@ -16,6 +16,8 @@
 #include "rng.h"
 #include "space.h"
 #include "faction.h"
+#include "llua.h"
+#include "lluadef.h"
 #include "ai.h"
 
 // == AI ======================================================
@@ -49,20 +51,8 @@
 //      (task).
 // ============================================================
 
-// FUCK LUA!!!
-//#define luaL_register(L,n,l) (luaL_openlib(L, (n),(l), 0))
-// Creates a new lua table.
-#define newtable(L)           (lua_newtable(L), lua_gettop(L))
 // Register a number constant n to name s (syntax is just like lua_regfunc).
 #define lua_regnumber(l,s,n)  (lua_pushnumber(l,n), lua_setglobal(l,s))
-// Registers a C function.
-#define lua_regfunc(l,s,f)    (lua_pushcfunction(l,f), lua_setglobal(L,s))
-// L state, void* buf, int n size, char* s identifier.
-#define luaL_dobuffer(L,b,n,s) \
-  (luaL_loadbuffer(L,b,n,s) || lua_pcall(L, 0, LUA_MULTRET, 0))
-
-// Don't run the function if (n) params aren't passed.
-#define MIN_ARGS(n) if(lua_gettop(L) < n) return 0
 
 // Ai flags.
 #define ai_setFlag(f) (pilot_flags |= f)
@@ -147,8 +137,6 @@ static int ai_broadcast(lua_State* L);          // broadcast(string)
 static int ai_credits(lua_State* L);            // credits(number).
 static int ai_cargo(lua_State* L);              // cargo(name, quantity).
 static int ai_shipprice(lua_State* L);          // shipprice().
-// Random.
-static int ai_rng(lua_State* L);                // rng(number, number)
 
 static const luaL_Reg ai_methods[] = {
   // Tasks.
@@ -201,8 +189,6 @@ static const luaL_Reg ai_methods[] = {
   { "setcredits",           ai_credits          },
   { "setcargo",             ai_cargo            },
   { "shipprice",            ai_shipprice        },
-  // Random.
-  { "rnd",                  ai_rng              },
   { 0, 0 } // End.
 };
 
@@ -291,6 +277,7 @@ static int ai_loadProfile(char* filename) {
 
   // Register C funstions in Lua.
   luaL_register(L, "ai", ai_methods);
+  lua_loadRnd(L);
 
   // Now load the file, since all the functions have been previously loaded.
   buf = pack_readfile(DATA, filename, &bufsize);
@@ -542,7 +529,7 @@ static int ai_pshield(lua_State* L) {
 static int ai_getdistance(lua_State* L) {
   Vec2* vect;
 
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
   vect = (lua_islightuserdata(L,1)) ?
     (Vec2*)lua_topointer(L,1) : NULL;
   lua_pushnumber(L, vect_dist(vect, &cur_pilot->solid->pos));
@@ -592,7 +579,7 @@ static int ai_cargofree(lua_State* L) {
 }
 
 static int ai_exists(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
 
   if(lua_isnumber(L,1)) {
     lua_pushboolean(L, (pilot_get((unsigned int)lua_tonumber(L,1)) != NULL)?1:0);
@@ -659,14 +646,14 @@ static int ai_accel(lua_State* L) {
 
 // Turn the pilot based on a param.
 static int ai_turn(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
   pilot_turn = (lua_isnumber(L, 1)) ? (double)lua_tonumber(L, 1) : 0.;
   return 0;
 }
 
 // Face the target.
 static int ai_face(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
   Vec2* v, sv, tv; // Grab the position to face.
   Pilot* p;
   double mod, diff;
@@ -816,7 +803,7 @@ static int ai_combat(lua_State* L) {
 
 // Set the pilots target.
 static int ai_settarget(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
 
   if(lua_isnumber(L,1)) pilot_target = (int)lua_tonumber(L,1);
   return 0;
@@ -874,7 +861,7 @@ static int ai_getenemy(lua_State* L) {
 
 // Set the enemy hostile. (Simply notifies of an impending attack).
 static int ai_hostile(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
 
   if(lua_isnumber(L,1) && ((unsigned int)lua_tonumber(L,1) == PLAYER_ID))
     pilot_setFlag(cur_pilot, PILOT_HOSTILE);
@@ -884,7 +871,7 @@ static int ai_hostile(lua_State* L) {
 
 // Set the timer.
 static int ai_settimer(lua_State* L) {
-  MIN_ARGS(2);
+  LLUA_MIN_ARGS(2);
 
   int n; // Get the timer.
   if(lua_isnumber(L, 1)) n = lua_tonumber(L,1);
@@ -896,7 +883,7 @@ static int ai_settimer(lua_State* L) {
 
 // Check the timer.
 static int ai_timeup(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
 
   int n; // Get the timer.
   if(lua_isnumber(L,1)) n = lua_tonumber(L,1);
@@ -907,7 +894,7 @@ static int ai_timeup(lua_State* L) {
 
 // Have the pilot say something to player.
 static int ai_comm(lua_State* L) {
-  MIN_ARGS(2);
+  LLUA_MIN_ARGS(2);
 
   if(lua_isnumber(L,1) && (lua_tonumber(L,1)==PLAYER_ID) && lua_isstring(L,2))
     player_message("Comm: %s> \"%s\"", cur_pilot->name, lua_tostring(L,2));
@@ -917,7 +904,7 @@ static int ai_comm(lua_State* L) {
 
 // Broadcasts to the entire area.
 static int ai_broadcast(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
 
   if(lua_isstring(L, 1))
     player_message("Broadcast: %s> \"%s\"", cur_pilot->name, lua_tostring(L,1));
@@ -927,7 +914,7 @@ static int ai_broadcast(lua_State* L) {
 
 // Set the pilots credits.
 static int ai_credits(lua_State* L) {
-  MIN_ARGS(1);
+  LLUA_MIN_ARGS(1);
   if(ai_status != AI_STATUS_CREATE) return 0;
 
   if(lua_isnumber(L,1))
@@ -938,7 +925,7 @@ static int ai_credits(lua_State* L) {
 
 // Set the pilots cargo.
 static int ai_cargo(lua_State* L) {
-  MIN_ARGS(2);
+  LLUA_MIN_ARGS(2);
   if(ai_status != AI_STATUS_CREATE) return 0;
 
   if(lua_isstring(L,1) && lua_isnumber(L,2))
@@ -954,26 +941,3 @@ static int ai_shipprice(lua_State* L) {
   return 1;
 }
 
-// Return a number between low and high.
-static int ai_rng(lua_State* L) {
-  int o;
-
-  o = lua_gettop(L);
-
-  if(o == 0) lua_pushnumber(L, RNGF()); // Random double 0 <= x <= 1.
-  else if(o == 1) { // Random int o <= x <= param.
-    if(lua_isnumber(L, -1))
-      lua_pushnumber(L, RNG(0, (int)lua_tonumber(L, -1)));
-    else return 0;
-  }
-  else if(o >= 2) { // Random int param 1 <= x <= param 2.
-    if(lua_isnumber(L, -1) && lua_isnumber(L, -2))
-      lua_pushnumber(L,
-          RNG((int)lua_tonumber(L, -2), (int)lua_tonumber(L, -1)));
-    else return 0;
-  }
-  else return 0;
-
-  return 1; // Unless it's returned 0 already it'll always return a param.
-}
-
diff --git a/src/lluadef.h b/src/lluadef.h
index e99cc9a..94dca7c 100644
--- a/src/lluadef.h
+++ b/src/lluadef.h
@@ -1,5 +1,6 @@
 #pragma once
 
+// Debug stuff.
 #define LLUA_DEBUG(str, args...) \
   (fprintf(stdout, "Lua: "str"\n", ## args))
 
@@ -14,3 +15,7 @@
     return 0; \
   }
 
+// Comfortability macros.
+#define luaL_dobuffer(L, b, n, s) \
+  (luaL_loadbuffer(L, b, n, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
+