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