[BACK]Return to curses-platform.c CVS log [TXT][DIR] Up to [contributed] / brogue-ce / src / platform

Annotation of brogue-ce/src/platform/curses-platform.c, Revision 1.1

1.1     ! rubenllo    1: #include <stdio.h>
        !             2: #include <string.h>
        !             3: #include <stdint.h>
        !             4: #include <signal.h>
        !             5: #include <sys/time.h>
        !             6: #include "platform.h"
        !             7: #include "term.h"
        !             8:
        !             9: static void gameLoop() {
        !            10:     signal(SIGINT, SIG_DFL); // keep SDL from overriding the default ^C handler when it's linked
        !            11:
        !            12:     if (!Term.start()) {
        !            13:         return;
        !            14:     }
        !            15:     Term.title("Brogue");
        !            16:     Term.resize(COLS, ROWS);
        !            17:
        !            18:     rogueMain();
        !            19:
        !            20:     Term.end();
        !            21: }
        !            22:
        !            23: static char glyphToAscii(enum displayGlyph glyph) {
        !            24:     unsigned int ch;
        !            25:
        !            26:     switch (glyph) {
        !            27:         case G_UP_ARROW: return '^';
        !            28:         case G_DOWN_ARROW: return 'v';
        !            29:         case G_FLOOR: return '.';
        !            30:         case G_CHASM: return ':';
        !            31:         case G_TRAP: return '%';
        !            32:         case G_FIRE: return '^';
        !            33:         case G_FOLIAGE: return '&';
        !            34:         case G_AMULET: return ',';
        !            35:         case G_SCROLL: return '?';
        !            36:         case G_RING: return '=';
        !            37:         case G_WEAPON: return '(';
        !            38:         case G_GEM: return '+';
        !            39:         case G_TOTEM: return '0'; // zero
        !            40:         case G_GOOD_MAGIC: return '$';
        !            41:         case G_BAD_MAGIC: return '+';
        !            42:         case G_DOORWAY: return '<';
        !            43:         case G_CHARM: return '7';
        !            44:         case G_GUARDIAN: return '5';
        !            45:         case G_WINGED_GUARDIAN: return '5';
        !            46:         case G_EGG: return 'o';
        !            47:         case G_BLOODWORT_STALK: return '&';
        !            48:         case G_FLOOR_ALT: return '.';
        !            49:         case G_UNICORN: return 'U';
        !            50:         case G_TURRET: return '*';
        !            51:         case G_CARPET: return '.';
        !            52:         case G_STATUE: return '5';
        !            53:         case G_CRACKED_STATUE: return '5';
        !            54:         case G_MAGIC_GLYPH: return ':';
        !            55:         case G_ELECTRIC_CRYSTAL: return '$';
        !            56:
        !            57:         default:
        !            58:             ch = glyphToUnicode(glyph);
        !            59:             brogueAssert(ch < 0x80); // assert ascii
        !            60:             return ch;
        !            61:     }
        !            62: }
        !            63:
        !            64: static void curses_plotChar(enum displayGlyph ch,
        !            65:               short xLoc, short yLoc,
        !            66:               short foreRed, short foreGreen, short foreBlue,
        !            67:               short backRed, short backGreen, short backBlue) {
        !            68:
        !            69:     fcolor fore;
        !            70:     fcolor back;
        !            71:
        !            72:     fore.r = (float) foreRed / 100;
        !            73:     fore.g = (float) foreGreen / 100;
        !            74:     fore.b = (float) foreBlue / 100;
        !            75:     back.r = (float) backRed / 100;
        !            76:     back.g = (float) backGreen / 100;
        !            77:     back.b = (float) backBlue / 100;
        !            78:
        !            79:     ch = glyphToAscii(ch);
        !            80:
        !            81:     if (ch < ' ' || ch > 127) ch = ' ';
        !            82:     Term.put(xLoc, yLoc, ch, &fore, &back);
        !            83: }
        !            84:
        !            85:
        !            86: struct mapsymbol {
        !            87:     int in_c, out_c;
        !            88:     struct mapsymbol *next;
        !            89: };
        !            90:
        !            91: static struct mapsymbol *keymap = NULL;
        !            92:
        !            93: static int rewriteKey(int key, boolean text) {
        !            94:     if (text) return key;
        !            95:
        !            96:     struct mapsymbol *s = keymap;
        !            97:     while (s != NULL) {
        !            98:         if (s->in_c == key) {
        !            99:             return s->out_c;
        !           100:         }
        !           101:
        !           102:         s = s->next;
        !           103:     }
        !           104:     return key;
        !           105: }
        !           106:
        !           107:
        !           108: #define PAUSE_BETWEEN_EVENT_POLLING     34//17
        !           109:
        !           110: static uint64_t getTime() {
        !           111:     struct timeval tv;
        !           112:     gettimeofday(&tv, NULL);
        !           113:     return (uint64_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
        !           114: }
        !           115:
        !           116: static boolean curses_pauseForMilliseconds(short milliseconds) {
        !           117:     Term.refresh();
        !           118:     Term.wait(milliseconds);
        !           119:
        !           120:     // hasKey returns true if we have a mouse event, too.
        !           121:     return Term.hasKey();
        !           122: }
        !           123:
        !           124: static void curses_nextKeyOrMouseEvent(rogueEvent *returnEvent, boolean textInput, boolean colorsDance) {
        !           125:     int key;
        !           126:     // TCOD_mouse_t mouse;
        !           127:     uint64_t theTime, waitTime;
        !           128:     // short x, y;
        !           129:
        !           130:     Term.refresh();
        !           131:
        !           132:     for (;;) {
        !           133:         theTime = getTime(); //TCOD_sys_elapsed_milli();
        !           134:
        !           135:         /*if (TCOD_console_is_window_closed()) {
        !           136:             rogue.gameHasEnded = true; // causes the game loop to terminate quickly
        !           137:             returnEvent->eventType = KEYSTROKE;
        !           138:             returnEvent->param1 = ACKNOWLEDGE_KEY;
        !           139:             return;
        !           140:         }*/
        !           141:
        !           142:         if (colorsDance) {
        !           143:             shuffleTerrainColors(3, true);
        !           144:             commitDraws();
        !           145:         }
        !           146:
        !           147:
        !           148:         key = Term.getkey();
        !           149:         if (key == TERM_MOUSE) {
        !           150:             if (Term.mouse.x > 0 && Term.mouse.y > 0 && Term.mouse.x < COLS && Term.mouse.y < ROWS) {
        !           151:                 returnEvent->param1 = Term.mouse.x;
        !           152:                 returnEvent->param2 = Term.mouse.y;
        !           153:                 returnEvent->eventType = KEYSTROKE;
        !           154:                 if (Term.mouse.justReleased) returnEvent->eventType = MOUSE_UP;
        !           155:                 if (Term.mouse.justPressed) returnEvent->eventType = MOUSE_DOWN;
        !           156:                 if (Term.mouse.justMoved) returnEvent->eventType = MOUSE_ENTERED_CELL;
        !           157:                 returnEvent->controlKey = Term.mouse.control;
        !           158:                 returnEvent->shiftKey = Term.mouse.shift;
        !           159:                 if (returnEvent->eventType != KEYSTROKE) return;
        !           160:             }
        !           161:         } else if (key != TERM_NONE) {
        !           162:             key = rewriteKey(key, textInput);
        !           163:
        !           164:             returnEvent->eventType = KEYSTROKE;
        !           165:             returnEvent->controlKey = 0; //(key.rctrl || key.lctrl);
        !           166:             returnEvent->shiftKey = 0; //key.shift;
        !           167:             returnEvent->param1 = key;
        !           168:
        !           169:             if (key == Term.keys.backspace || key == Term.keys.del) returnEvent->param1 = DELETE_KEY;
        !           170:             else if (key == Term.keys.up) returnEvent->param1 = UP_ARROW;
        !           171:             else if (key == Term.keys.down) returnEvent->param1 = DOWN_ARROW;
        !           172:             else if (key == Term.keys.left) returnEvent->param1 = LEFT_ARROW;
        !           173:             else if (key == Term.keys.right) returnEvent->param1 = RIGHT_ARROW;
        !           174:             else if (key == Term.keys.quit) {
        !           175:                 rogue.gameHasEnded = true;
        !           176:                 rogue.nextGame = NG_QUIT; // causes the menu to drop out immediately
        !           177:             }
        !           178:             else if ((key >= 'A' && key <= 'Z')) {
        !           179:                 returnEvent->shiftKey = 1;
        !           180:                 // returnEvent->param1 += 'a' - 'A';
        !           181:             }
        !           182:             // we could try to catch control keys, where possible, but we'll catch keys we mustn't
        !           183:             /* else if ((key >= 'A'-'@' && key <= 'Z'-'@')) {
        !           184:                 returnEvent->controlKey = 1;
        !           185:                 returnEvent->param1 += 'a' - ('A'-'@');
        !           186:             } */
        !           187:
        !           188:             return;
        !           189:         }
        !           190:
        !           191:         waitTime = PAUSE_BETWEEN_EVENT_POLLING + theTime - getTime();
        !           192:
        !           193:         if (waitTime > 0 && waitTime <= PAUSE_BETWEEN_EVENT_POLLING) {
        !           194:             curses_pauseForMilliseconds(waitTime);
        !           195:         }
        !           196:     }
        !           197: }
        !           198:
        !           199: static void curses_remap(const char *input_name, const char *output_name) {
        !           200:     struct mapsymbol *sym = malloc(sizeof(*sym));
        !           201:
        !           202:     if (sym == NULL) return; // out of memory?  seriously?
        !           203:
        !           204:     sym->in_c = Term.keycodeByName(input_name);
        !           205:     sym->out_c = Term.keycodeByName(output_name);
        !           206:
        !           207:     sym->next = keymap;
        !           208:     keymap = sym;
        !           209: }
        !           210:
        !           211: static boolean modifier_held(int modifier) {
        !           212:     return 0;
        !           213: }
        !           214:
        !           215: struct brogueConsole cursesConsole = {
        !           216:     gameLoop,
        !           217:     curses_pauseForMilliseconds,
        !           218:     curses_nextKeyOrMouseEvent,
        !           219:     curses_plotChar,
        !           220:     curses_remap,
        !           221:     modifier_held,
        !           222:     NULL,
        !           223:     NULL,
        !           224:     NULL
        !           225: };

CVSweb