#include "netris.h"
#include <stdlib.h>
+#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#include <sys/types.h>
};
enum {
- KT_left, KT_right, KT_rotright, KT_rotleft, KT_drop, KT_down,
+ KT_left, KT_right, KT_rotright, KT_rotleft, KT_drop, KT_dropsoft, KT_down,
KT_faster, KT_pause, KT_redraw, KT_say, KT_quit, KT_numKeys
};
static char *keyNames[KT_numKeys+1] = {
- "Left", "Right", "RotRight", "RotLeft", "Drop", "Down",
+ "Left", "Right", "RotRight", "RotLeft", "Drop", "DropSoft", "Down",
"Faster", "Pause", "Redraw", "Say", "Quit", NULL
};
static char keyTable[KT_numKeys+1];
enum {
+ CT_quit, CT_pause,
CT_MAX
};
static char *cmds[] = {
+ "quit", "pause"
};
static char *hostStr;
{
int changed = 0;
short gameStatus = 2; //2=loop; 1=new piece; 0=quit
- int dropMode = 0;
int chatMode = 0;
char chatText[MSG_WIDTH] = "\0";
void handle_cmd(char cmd, char *arg)
{
switch (cmd) {
+ case CT_quit:
+ ShowPause(me);
+ refresh();
+ gameStatus = 0;
+ return;
+ case CT_pause:
+ if (Players[me].alive <= 0) return;
+ Players[me].flags ^= SCF_paused;
+ if (Game.started > 1)
+ Message(Players[me].flags & SCF_paused
+ ? "You paused the game" : "You unpaused the game");
+ else
+ Message(Players[me].flags & SCF_paused
+ ? "You are not ready" : "You are ready");
+ checkPaused();
+ if (game == GT_classicTwo)
+ SendPacket(me, NP_pause, 0, NULL);
+ ShowPause(me);
+ changed = 1;
+ return;
}
}
if (!(p = strchr(keyTable, tolower(key)))) return;
key = p - keyTable;
- // global actions (always possible, even if not playing)
+ bool handle_key(char key)
+ {
switch (key) {
case KT_redraw:
clear();
InitFields();
// ScheduleFullRedraw();
refresh();
- return;
+ return 1;
case KT_say:
chatMode = 1;
Messagetype(key, strlen(chatText) - 1, chatText);
- return;
+ return 1;
case KT_quit:
- ShowPause(me);
- refresh();
- gameStatus = 0;
- return;
- }
-
- if (Players[me].alive <= 0) return;
- // actions available while in game
- switch (key) {
+ handle_cmd(CT_quit, NULL);
+ return 1;
case KT_pause:
- Players[me].flags ^= SCF_paused;
- if (Game.started > 1)
- Message(Players[me].flags & SCF_paused
- ? "You paused the game" : "You unpaused the game");
- else
- Message(Players[me].flags & SCF_paused
- ? "You are not ready" : "You are ready");
- checkPaused();
- if (game == GT_classicTwo)
- SendPacket(me, NP_pause, 0, NULL);
- ShowPause(me);
- changed = 1;
- return;
+ handle_cmd(CT_pause, NULL);
+ return 1;
+ default:
+ return 0;
}
+ }
+ // global actions (always possible, even if not playing)
+ if (handle_key(key)) return;
- if (paused) return;
+ if (Players[me].alive <= 0 || paused) return;
// actions only available while actually playing
switch (key) {
case KT_left:
else
gameStatus = 1; //completely dropped
break;
- case KT_drop:
+ case KT_dropsoft:
SetITimer(Game.speed, Game.speed);
if (DropPiece(me)) {
if (spied) SendPacket(me, NP_drop, 0, NULL);
- if (!Sets.dropmode) gameStatus = 1; //instadrop
}
else gameStatus = 1; //dropped
- dropMode = Sets.dropmode > 1;
+ break;
+ case KT_drop:
+ SetITimer(Game.speed, Game.speed);
+ if (DropPiece(me)) {
+ if (spied) SendPacket(me, NP_drop, 0, NULL);
+ }
+ gameStatus = 1; // drop
break;
case KT_faster:
if (game != GT_onePlayer) break;
changed = 1;
break;
}
-
- if (dropMode && DropPiece(me) > 0) {
- SetITimer(Game.speed, Game.speed);
- if (spied) SendPacket(me, NP_drop, 0, NULL);
- }
return;
} //GameKey
oldPaused = paused;
} //(un)pause
} //game loop
- dropMode = 0;
Players[me].score.score++;
CheckClears(me);
} //new piece loop