Bläddra i källkod

Basic lua script structure

Eiyeron Fulmincendii 9 år sedan
förälder
incheckning
678600dfd3
4 ändrade filer med 126 tillägg och 73 borttagningar
  1. 9 0
      data/blinky.lua
  2. 109 70
      src/pacman/GameState.cpp
  3. 8 2
      src/pacman/GameState.h
  4. 0 1
      src/pacman/Player.cpp

+ 9 - 0
data/blinky.lua

@@ -0,0 +1,9 @@
+blinky = {
+    t = 0,
+    init = function(self)
+        print("Hello World!")
+    end,
+    update = function(self)
+        self.t = self.t + 1
+    end
+}

+ 109 - 70
src/pacman/GameState.cpp

@@ -8,6 +8,8 @@
 #include "Player.h"
 #include "static_data.h"
 
+#include <luwra.hpp>
+
 using Pacman::GameState;
 using Pacman::Player;
 using Pacman::ButtonInput;
@@ -22,94 +24,93 @@ using WalrusRPG::Input::Key;
 
 uint16_t map_data[] = {
 	5,3,3,3,3,3,3,3,3,3,3,3,3,13,14,3,3,3,3,3,3,3,3,3,3,3,3,6,
-1,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,2,
-1,0,9,15,15,10,0,9,15,15,15,10,0,18,17,0,9,15,15,15,10,0,9,15,15,10,0,2,
-1,0,18,0,0,17,0,18,0,0,0,17,0,18,17,0,18,0,0,0,17,0,18,0,0,17,0,2,
-1,0,11,16,16,12,0,11,16,16,16,12,0,11,12,0,11,16,16,16,12,0,11,16,16,12,0,2,
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
-1,0,9,15,15,10,0,9,10,0,9,15,15,15,15,15,15,10,0,9,10,0,9,15,15,10,0,2,
-1,0,11,16,16,12,0,18,17,0,11,16,16,24,23,16,16,12,0,18,17,0,11,16,16,12,0,2,
-1,0,0,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,0,0,2,
-7,4,4,4,4,10,0,18,25,15,15,10,0,18,17,0,9,15,15,26,17,0,9,4,4,4,4,8,
-0,0,0,0,0,1,0,18,23,16,16,12,0,11,12,0,11,16,16,24,17,0,2,0,0,0,0,0,
-0,0,0,0,0,1,0,18,17,0,0,0,0,0,0,0,0,0,0,18,17,0,2,0,0,0,0,0,
-0,0,0,0,0,1,0,18,17,0,19,4,4,31,31,4,4,20,0,18,17,0,2,0,0,0,0,0,
-3,3,3,3,3,12,0,11,12,0,2,0,0,0,0,0,0,1,0,11,12,0,11,3,3,3,3,3,
-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
-4,4,4,4,4,10,0,9,10,0,2,0,0,0,0,0,0,1,0,9,10,0,9,4,4,4,4,4,
-0,0,0,0,0,1,0,18,17,0,21,3,3,3,3,3,3,22,0,18,17,0,2,0,0,0,0,0,
-0,0,0,0,0,1,0,18,17,0,0,0,0,0,0,0,0,0,0,18,17,0,2,0,0,0,0,0,
-0,0,0,0,0,1,0,18,17,0,9,15,15,15,15,15,15,10,0,18,17,0,2,0,0,0,0,0,
-5,3,3,3,3,12,0,11,12,0,11,16,16,24,23,16,16,12,0,11,12,0,11,3,3,3,3,6,
-1,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,2,
-1,0,9,15,15,10,0,9,15,15,15,10,0,18,17,0,9,15,15,15,10,0,9,15,15,10,0,2,
-1,0,11,16,24,17,0,11,16,16,16,12,0,11,12,0,11,16,16,16,12,0,18,23,16,12,0,2,
-1,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,2,
-27,15,10,0,18,17,0,9,10,0,9,15,15,15,15,15,15,10,0,9,10,0,18,17,0,9,15,29,
-28,16,12,0,11,12,0,18,17,0,11,16,16,24,23,16,16,12,0,18,17,0,11,12,0,11,16,30,
-1,0,0,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,0,0,2,
-1,0,9,15,15,15,15,26,25,15,15,10,0,18,17,0,9,15,15,26,25,15,15,15,15,10,0,2,
-1,0,11,16,16,16,16,16,16,16,16,12,0,11,12,0,11,16,16,16,16,16,16,16,16,12,0,2,
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
-7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,
+	1,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,2,
+	1,0,9,15,15,10,0,9,15,15,15,10,0,18,17,0,9,15,15,15,10,0,9,15,15,10,0,2,
+	1,0,18,0,0,17,0,18,0,0,0,17,0,18,17,0,18,0,0,0,17,0,18,0,0,17,0,2,
+	1,0,11,16,16,12,0,11,16,16,16,12,0,11,12,0,11,16,16,16,12,0,11,16,16,12,0,2,
+	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+	1,0,9,15,15,10,0,9,10,0,9,15,15,15,15,15,15,10,0,9,10,0,9,15,15,10,0,2,
+	1,0,11,16,16,12,0,18,17,0,11,16,16,24,23,16,16,12,0,18,17,0,11,16,16,12,0,2,
+	1,0,0,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,0,0,2,
+	7,4,4,4,4,10,0,18,25,15,15,10,0,18,17,0,9,15,15,26,17,0,9,4,4,4,4,8,
+	0,0,0,0,0,1,0,18,23,16,16,12,0,11,12,0,11,16,16,24,17,0,2,0,0,0,0,0,
+	0,0,0,0,0,1,0,18,17,0,0,0,0,0,0,0,0,0,0,18,17,0,2,0,0,0,0,0,
+	0,0,0,0,0,1,0,18,17,0,19,4,4,31,31,4,4,20,0,18,17,0,2,0,0,0,0,0,
+	3,3,3,3,3,12,0,11,12,0,2,0,0,0,0,0,0,1,0,11,12,0,11,3,3,3,3,3,
+	0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+	4,4,4,4,4,10,0,9,10,0,2,0,0,0,0,0,0,1,0,9,10,0,9,4,4,4,4,4,
+	0,0,0,0,0,1,0,18,17,0,21,3,3,3,3,3,3,22,0,18,17,0,2,0,0,0,0,0,
+	0,0,0,0,0,1,0,18,17,0,0,0,0,0,0,0,0,0,0,18,17,0,2,0,0,0,0,0,
+	0,0,0,0,0,1,0,18,17,0,9,15,15,15,15,15,15,10,0,18,17,0,2,0,0,0,0,0,
+	5,3,3,3,3,12,0,11,12,0,11,16,16,24,23,16,16,12,0,11,12,0,11,3,3,3,3,6,
+	1,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,2,
+	1,0,9,15,15,10,0,9,15,15,15,10,0,18,17,0,9,15,15,15,10,0,9,15,15,10,0,2,
+	1,0,11,16,24,17,0,11,16,16,16,12,0,11,12,0,11,16,16,16,12,0,18,23,16,12,0,2,
+	1,0,0,0,18,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,17,0,0,0,2,
+	27,15,10,0,18,17,0,9,10,0,9,15,15,15,15,15,15,10,0,9,10,0,18,17,0,9,15,29,
+	28,16,12,0,11,12,0,18,17,0,11,16,16,24,23,16,16,12,0,18,17,0,11,12,0,11,16,30,
+	1,0,0,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,18,17,0,0,0,0,0,0,2,
+	1,0,9,15,15,15,15,26,25,15,15,10,0,18,17,0,9,15,15,26,25,15,15,15,15,10,0,2,
+	1,0,11,16,16,16,16,16,16,16,16,12,0,11,12,0,11,16,16,16,16,16,16,16,16,12,0,2,
+	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+	7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,
 };
 
 const uint8_t gums_model[] = {
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
-0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
-0,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,2,0,
-0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
-0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
-0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,
-0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,
-0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
-0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
-0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
-0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
-0,2,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,2,0,
-0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,
-0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,
-0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,
-0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,
-0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,
-0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
+	0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
+	0,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,2,0,
+	0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
+	0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
+	0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,
+	0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,
+	0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+	0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
+	0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
+	0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,
+	0,2,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,2,0,
+	0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,
+	0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,
+	0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,
+	0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,
+	0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,
+	0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
+	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 };
 
-
 GameState::GameState() : level(1), map(28, 31, map_data, nullptr, map_texture), cam(-(320-28*8)/2,4),
-	p1(4,4), p2(204,228)
-
+	p1(4,4), p2(204,228), L(luaL_newstate()), blinky_ready(false)
 {
 	p1.up = new ButtonInput(K_A);
 	p1.down = new ButtonInput(K_B);
 	p1.left = new ButtonInput(K_L);
 	p1.right = new ButtonInput(K_R);
-	
+
 	p2.up = new ButtonInput(K_UP);
 	p2.down = new ButtonInput(K_DOWN);
 	p2.left = new ButtonInput(K_LEFT);
 	p2.right = new ButtonInput(K_RIGHT);
 
-
+	luaL_openlibs(L);
+	load_ghost_script("data/blinky.lua", "blinky", blinky_ready);
 	set_gums();
 }
 
 GameState::~GameState()
 {
-
+	lua_close(L);
 }
 
 void GameState::update(unsigned dt)
@@ -119,6 +120,7 @@ void GameState::update(unsigned dt)
 	p2.update(dt);
 	move_player(p1);
 	move_player(p2);
+	update_ghost("blinky", blinky_ready);
 }
 
 void GameState::render(unsigned dt)
@@ -147,7 +149,7 @@ void GameState::render(unsigned dt)
 	p1.render(dt, cam);
 	p2.render(dt, cam);
 	// Borders
-	
+
 	put_rectangle({0, 0, 0u-cam.get_x(), 320}, DarkGray);
 	put_rectangle({320+cam.get_x(), 0, 0u-cam.get_x(), 320}, DarkGray);
 	put_rectangle({-cam.get_x(),0, 1, 240}, White);
@@ -171,7 +173,7 @@ void GameState::set_gums()
  * Assumes that said Rect as big or smaller than a tile
  * (8 x 8 pixels).
  * Also assumes that a corner outside the map doesn't collide anything.
- * Assumes that you lost the game and any tile != 0 is solid. 
+ * Assumes that you lost the game and any tile != 0 is solid.
  */
 bool GameState::does_collide_a_wall(Rect r)
 {
@@ -226,4 +228,41 @@ void GameState::move_player(Player &p)
 		p.x = 224-8;
 	if(p.x+16 > 232)
 		p.x = 0;
-}
+}
+
+void GameState::load_ghost_script(const char* filename, const char* ghost_name, bool& ready_flag)
+{
+	int result = luaL_loadfile (L, filename) || lua_pcall(L,0,0,0);
+	if(result != LUA_OK)
+	{
+		Logger::error("Lua : Error while loading %s : %s", filename, lua_tostring(L, -1));
+		lua_pop(L, 1);
+		ready_flag = false;
+	}
+	else{
+		Logger::log("Lua : %s correctly loaded.", filename);
+		try {
+			lua_getglobal(L, ghost_name);
+			luwra::Table t = luwra::read<luwra::Table>(L, -1);
+			t.get<luwra::NativeFunction<void>>("init")(t);
+			ready_flag = true;
+		} catch(std::exception e)
+		{
+			Logger::error("Error while loading %s : %s", ghost_name);
+			ready_flag = false;
+		}
+	}
+}
+
+void GameState::update_ghost(const char* ghost_name, bool& ready_flag) {
+	if(ready_flag) {
+		try{
+			lua_getglobal(L, ghost_name);
+			luwra::Table t = luwra::read<luwra::Table>(L, -1);
+			t.get<luwra::NativeFunction<void>>("update")(t);
+		}catch(std::exception e) {
+			Logger::error("Error while executing %s: %s", ghost_name, e.what());
+			ready_flag = false;
+		}
+	}
+}

+ 8 - 2
src/pacman/GameState.h

@@ -5,11 +5,12 @@
 #include "render/Camera.h"
 #include "utility/Rect.h"
 #include "Player.h"
+#include <lua.hpp>
 
 namespace Pacman
 {
 	enum Pacgum:uint8_t {NOTHING, NORMAL, SUPER};
-	
+
 	class GameState : public WalrusRPG::States::State {
 	private:
 		unsigned level;
@@ -18,6 +19,8 @@ namespace Pacman
 		WalrusRPG::Camera cam;
 		Player p1;
 		Player p2;
+		lua_State *L;
+		bool blinky_ready;
 	public:
 		GameState();
 		~GameState();
@@ -28,7 +31,10 @@ namespace Pacman
         bool does_collide_a_wall(WalrusRPG::Utils::Rect r);
         void move_player(Player &p);
         void render_player(WalrusRPG::Utils::Rect r);
+		void load_ghost_script(const char* filename, const char* ghost_name, bool& ready_flag);
+		void update_ghost(const char* ghost_name, bool& ready_flag);
+
 	};
 }
 
-#endif
+#endif

+ 0 - 1
src/pacman/Player.cpp

@@ -18,7 +18,6 @@ ButtonInput::~ButtonInput()
 
 bool ButtonInput::operator()()
 {
-	printf("key %d => %d\n", key, key_down(key));
 	return key_down(key);
 }