3b1787ebd14ce10c950f6e537df70d7d5a1b7c6d
[dungeon-master.git] / src / main.cpp
1 #include <irrlicht/irrlicht.h>
2 #include <libguile.h>
3
4 using namespace irr;
5 using namespace core;
6 using namespace video;
7
8 SCM register_generator(SCM name, SCM proc)
9 {
10   printf ("Register: %s\n", scm_to_locale_string(name));
11   scm_call_1(proc, scm_from_int(-1));
12   return SCM_UNSPECIFIED;
13 }
14
15 void init_dungeon_master_module(void *unused)
16 {
17   scm_c_define_gsubr("register-generator", 2, 0, 0, (scm_t_subr)register_generator);
18   scm_c_export("register-generator", NULL);
19 }
20
21 void scm_init_dungeon_master_module()
22 {
23   scm_c_define_module("dungeon-master", init_dungeon_master_module, NULL);
24 }
25
26 int main()
27 {
28   scm_init_guile();
29   scm_init_dungeon_master_module();
30   scm_primitive_load(scm_from_locale_string("plugins/default/main.scm"));
31
32   IrrlichtDevice* device =
33     createDevice(EDT_OPENGL,
34                  dimension2d<u32>(640, 480), 16,
35                  false, false, false, 0);
36   if (!device)
37     return 1;
38
39   IVideoDriver* driver = device->getVideoDriver();
40
41   f32 bg_r = 255.0f;
42   f32 bg_g = 255.0f;
43   f32 bg_b = 255.0f;
44
45   bool fadeOut = -1;
46
47   u32 then = device->getTimer()->getTime();
48
49   const f32 fadeRate = 0.1f;
50
51   while (device->run())
52     {
53       const u32 now = device->getTimer()->getTime();
54       const f32 frameDeltaTime = (f32)(now - then);
55       then  = now;
56
57       if (bg_r <= 0.0f) fadeOut = false;
58       else if (bg_r >= 255.0f) fadeOut = true;
59
60       if (fadeOut)
61         {
62           bg_r -= fadeRate * frameDeltaTime;
63           bg_g -= fadeRate * frameDeltaTime;
64           bg_b -= fadeRate * frameDeltaTime;
65         }
66       else
67         {
68           bg_r += fadeRate * frameDeltaTime;
69           bg_g += fadeRate * frameDeltaTime;
70           bg_b += fadeRate * frameDeltaTime;
71         }
72           
73       if (bg_r <= 0.0f)
74         bg_r = bg_b = bg_g = 0.0f;
75       else if (bg_r >= 255.0f)
76         bg_r = bg_b = bg_g = 255.0f;
77       
78       driver->beginScene(true, true, SColor(255, (u32)bg_r,
79                                             (u32)bg_g, (u32)bg_b));
80       driver->endScene();
81     }
82
83   device->drop();
84
85   return 0;
86 }