1 // wtf, 1st SMS game
2 // Copy [p]left 2015 The Mojon Twins
3
4 const unsigned char wtf_name[] = "Moggy";
5 const unsigned char wtf_author[] = "MojonTwins";
6 const unsigned char wtf_description[] = "Pero que seto";
7
8 #include <arch/sms/SMSlib.h>
9 #include <arch/sms/PSGlib.h>
10 #include <stdlib.h>
11
12 #include "definitions.h"
13
14 #include "bank2.h"
15 #include "bank3.h"
16 #include "music_defs.h"
17 #include "palettes.h"
18 #include "tiles.h"
19 #include "sprites.h"
20 #include "title.h"
21 #include "vs_scr.h"
22
23 #include "printer.h"
24 #include "menu.h"
25 #include "terraingen.h"
26 #include "engine.h"
27
main(void)28 void main (void) {
29 // Check TV system
30 tv_system = (SMS_VDPType () & VDP_NTSC) ? 1 : 0;
31
32 // Fixed. This is the only banking I need for this game.
33 SMS_mapROMBank (2 + tv_system);
34
35 // Initialize
36 hi_score = 0;
37 player_controller_KEY_LEFT [0] = PORT_A_KEY_LEFT;
38 player_controller_KEY_LEFT [1] = PORT_B_KEY_LEFT;
39 player_controller_KEY_RIGHT [0] = PORT_A_KEY_RIGHT;
40 player_controller_KEY_RIGHT [1] = PORT_B_KEY_RIGHT;
41 player_controller_KEY_UP [0] = PORT_A_KEY_UP;
42 player_controller_KEY_UP [1] = PORT_B_KEY_UP;
43 player_controller_KEY_DOWN [0] = PORT_A_KEY_DOWN;
44 player_controller_KEY_DOWN [1] = PORT_B_KEY_DOWN;
45
46 // Sprites will not change, nor the sprites palette, so
47 // I load them here:
48 SMS_loadSpritePalette (palette_1);
49 SMS_loadTiles (sprites, 256, 32 * 32);
50
51 // Main, infinite loop
52 while (1) {
53 level = 0;
54 score [0] = score [1] = 0;
55 won [0] = won [1] = 0;
56 nn = 5;
57 rano = 0;
58
59 // testing
60 game_mode = menu ();
61
62 game_over = 0;
63 do_game = 1;
64 plives [0] = plives [1] = 5;
65 pactive [0] = pactive [1] = 1;
66
67 while (do_game) {
68
69 // Draw shit
70 terraingen ();
71 add_schrooms (8);
72 add_item (nn, 5);
73 add_item (nn, 6);
74 draw_terrain ();
75 update_hud ();
76
77 // Init
78 init_moggys ();
79 if (rano) init_rano ();
80
81 // Set palette
82 SMS_loadBGPalette (palette_0);
83
84 // Load patterns for tiles. 48 tiles, 32 bytes per tile.
85 SMS_loadTiles (tiles, 0, 48 * 32);
86
87 // Show shit
88 SMS_displayOn ();
89
90 friends [0] = friends [1] = 0;
91 do_level = 1;
92
93 PSGPlay (m_ingame [tv_system]);
94
95 while (do_level) {
96 // Update sprites
97 SMS_initSprites ();
98 if (game_mode == GAME_A) {
99 SMS_addSprite (ppx [0], ppy [0], pframe [0]);
100 } else {
101 SMS_addSprite (ppx [0], ppy [0], pframe [0]);
102 SMS_addSprite (ppx [1], ppy [1], 16 + pframe [1]);
103 }
104 if (rano) {
105 SMS_addSprite (rx, ry, rframe);
106 SMS_addSprite (rx + 8, ry, rframe + 1);
107 SMS_addSprite (rx, ry + 8, rframe + 2);
108 SMS_addSprite (rx + 8, ry + 8, rframe + 3);
109 }
110 SMS_finalizeSprites ();
111
112 // Game logic
113 move_moggy (0);
114 if (game_mode == GAME_B) {
115 move_moggy (1);
116 collide_moggies ();
117 }
118 if (rano) move_rano ();
119
120 if (game_mode == GAME_A) {
121 if (friends [0] == nn) do_level = 0;
122 if (plives [0] == 0) { do_level = 0; game_over = 1; PSGSFXPlay (s_psg4 [tv_system], SFX_CHANNEL2); }
123 } else {
124 if (friends [0] + friends [1] == nn) do_level = 0;
125 if (pactive [0] && plives [0] == 0) { pactive [0] = 0; PSGSFXPlay (s_psg4 [tv_system], SFX_CHANNEL2); do_game = 0; }
126 if (pactive [1] && plives [1] == 0) { pactive [1] = 0; PSGSFXPlay (s_psg4 [tv_system], SFX_CHANNEL2); do_game = 0; }
127 if (pactive [0] == 0 && pactive [1] == 0) { game_over = 1; do_level = 0; }
128 }
129
130 // Wait for VSync and update SAT
131 SMS_waitForVBlank ();
132 SMS_copySpritestoSAT ();
133
134 // Murcia stuff
135 PSGFrame ();
136 PSGSFXFrame ();
137 }
138
139 PSGStop ();
140 PSGSFXStop ();
141
142 // Remove sprites
143 SMS_initSprites ();
144 SMS_finalizeSprites ();
145 SMS_waitForVBlank ();
146 SMS_copySpritestoSAT ();
147
148 if (game_over) {
149 do_game = 0;
150
151 SMS_waitForVBlank ();
152 SMS_setTileatXY (15, 12, 0x1000 + 29);
153 SMS_setTile (0x1000 + 30);
154 SMS_setTile (0x1000 + 31);
155
156 PSGPlay (m_gover [tv_system]);
157 wait_button ();
158 PSGStop ();
159 } else {
160 level ++;
161 nn = nn + 5;
162 if (0 == (nn & 1)) nn ++; // Make odd!
163 rano = rand () & 1;
164 if (game_mode == GAME_A || pactive [0]) score [0] = score [0] + 10;
165 if (game_mode == GAME_B && pactive [1]) score [1] = score [1] + 10;
166 }
167
168 // Disable screen
169 effect (28);
170 SMS_displayOff ();
171
172 if (game_mode == GAME_B) do_vs_screen ();
173 }
174 }
175 }
176