static void activate(int val) { if (self->active == FALSE) { if (removeInventoryItemByObjectiveName(self->requires) == TRUE) { self->active = TRUE; self->thinkTime = 60; fireTrigger(self->objectiveName); fireGlobalTrigger(self->objectiveName); setEntityAnimation(self, "WALK"); self->action = &sink; setInfoBoxMessage(60, 255, 255, 255, _("Used %s"), _(self->requires)); } else { setInfoBoxMessage(60, 255, 255, 255, _("%s is required"), _(self->requires)); } } }
static void soulLeave() { if (self->flags & FLY) { self->thinkTime--; if (self->thinkTime <= 0) { removeInventoryItemByObjectiveName("Amulet of Resurrection"); player.die(); self->thinkTime = 30; self->flags &= ~FLY; } } checkToMap(self); if (self->flags & ON_GROUND) { self->thinkTime--; if (self->thinkTime <= 0) { setEntityAnimation(self, "WALK"); self->dirX = -self->speed; } } }
static void touch(Entity *other) { pushEntity(other); if (self->type == MANUAL_DOOR) { if (other->type == PLAYER && self->active == FALSE) { /* Look through the player's inventory */ if (removeInventoryItemByObjectiveName(self->requires) == TRUE) { setInfoBoxMessage(60, 255, 255, 255, _("Used %s"), _(self->requires)); self->action = &moveToTarget; self->active = TRUE; } else { setInfoBoxMessage(60, 255, 255, 255, _("%s is needed to open this door"), _(self->requires)); } } } else if (other->type == PLAYER && self->active == FALSE && self->mental == 0) { setInfoBoxMessage(60, 255, 255, 255, _("This door is locked")); } }
static void activate(int val) { if (strlen(self->requires) != 0) { if (removeInventoryItemByObjectiveName(self->requires) == TRUE) { self->requires[0] = '\0'; setEntityAnimation(self, "WALK"); } else { setInfoBoxMessage(90, 255, 255, 255, _("%s is required"), _(self->requires)); return; } } generateInputCode(); self->mental = 0; self->thinkTime = 120; setInfoBoxMessage(300, 255, 255, 255, _("Repeat the sequence")); self->action = &displayInputCode; self->touch = NULL; self->activate = NULL; setPlayerLocked(TRUE); }
static void activate(int val) { Entity *e; if (self->health == 3) { e = addTeslaPack(0, 0, "item/tesla_pack_full"); addToInventory(e); self->health = -1; } else { e = getInventoryItemByObjectiveName("Tesla Pack"); if (e != NULL && e->health == 0) { removeInventoryItemByObjectiveName(e->objectiveName); self->health = 0; self->thinkTime = 180; } } setChargeState(); }
static void useBottle(int val) { Entity *e; if (game.status == IN_GAME && player.element != WATER) { playSoundToMap("sound/common/throw", -1, player.x, player.y, 0); e = addEntity(*self, player.x + (player.face == LEFT ? 0 : player.w), player.y); e->dirX = player.face == LEFT ? -5 : 5; e->flags &= ~ON_GROUND; e->dirY = ITEM_JUMP_HEIGHT; e->face = player.face; e->action = &soulActivate; e->touch = &soulTouch; e->health = 0; e->thinkTime = 300; setEntityAnimation(e, "WALK"); removeInventoryItemByObjectiveName(self->objectiveName); } }
void getInventoryItemFromScript(char *line) { char command[15], itemName[MAX_VALUE_LENGTH], entityName[MAX_VALUE_LENGTH], quiet[MAX_VALUE_LENGTH]; int quantity, success, failure, quantityToRemove, read; Entity *e, *item; read = sscanf(line, "%s \"%[^\"]\" %d %d %s %d %d %s", command, itemName, &quantity, &quantityToRemove, entityName, &success, &failure, quiet); if (read < 7) { showErrorAndExit("HAS_ITEM or REMOVE command has wrong number of arguments"); } e = getEntityByObjectiveName(entityName); if (e == NULL) { showErrorAndExit("Could not find Entity %s to give item %s to", entityName, itemName); } item = getInventoryItemByObjectiveName(itemName); if (item != NULL && (item->health >= quantity || quantity == 1)) { if (strcmpignorecase(command, "REMOVE") == 0) { item->health -= quantityToRemove; updateTrigger(itemName, quantityToRemove); updateGlobalTrigger(itemName, quantityToRemove); if (item->health <= 0 || quantityToRemove == -1) { item->health = 0; removeInventoryItemByObjectiveName(itemName); if (read == 7) { setInfoBoxMessage(90, 255, 255, 255, _("Removed %s"), _(itemName)); } } } e->health = success; } else { e->health = failure; } }
static void addStatue(int val) { Entity *e; if (self->target == NULL) { e = getCurrentInventoryItem(); if (e == NULL || strstr(e->name, "_statue") == NULL) { runScript("statue_required"); } else { STRNCPY(self->objectiveName, e->objectiveName, sizeof(e->objectiveName)); e = addEntity(*e, self->x, self->y); self->target = e; self->target->x = self->x + self->w / 2; self->target->x -= self->target->w / 2; self->target->y = self->y - self->target->h; self->target->flags |= FLY; self->target->touch = NULL; self->target->action = &statueWait; removeInventoryItemByObjectiveName(e->objectiveName); validate(); } } else { e = addEntity(*self->target, 0, 0); addToInventory(e); self->target->inUse = FALSE; self->target = NULL; self->objectiveName[0] = '\0'; } }
static void touch(Entity *other) { if (game.cheating == TRUE && other->type == PLAYER && other->health > 0) { removeInventoryItemByObjectiveName("Amulet of Resurrection"); other->die(); } else { entityTouch(other); } }
static void activate(int val) { Entity *e = getCurrentInventoryItem(); if (e == NULL || strcmpignorecase(e->name, "item/instruction_card") != 0) { runScript("instruction_card"); } else if (strlen(e->requires) == 0) { runScript("no_instructions"); } else { runScript("robot_start"); e = addEntity(*e, self->x, self->y); e->touch = NULL; e->flags |= NO_DRAW; removeInventoryItemByObjectiveName(e->objectiveName); self->target = e; self->action = &processNextInstruction; self->active = TRUE; self->mental = 0; setPlayerLocked(TRUE); centerMapOnEntity(self); } }
static void flameTouch(Entity *other) { int playerHealth; Entity *temp; if (other->type == PLAYER) { playerHealth = other->health; if (game.cheating == TRUE) { game.infiniteEnergy = FALSE; self->flags |= UNBLOCKABLE; } temp = self; self = other; self->takeDamage(temp, temp->damage); self = temp; if (other->health != playerHealth) { setPlayerAsh(); other->flags |= NO_DRAW; removeInventoryItemByObjectiveName("Amulet of Resurrection"); other->die(); other->mental = 1; } } }
static void activate(int val) { if (self->active == FALSE && self->health > 0) { if (removeInventoryItemByObjectiveName(self->requires) == TRUE) { self->active = TRUE; fireTrigger(self->objectiveName); fireGlobalTrigger(self->objectiveName); playSoundToMap("sound/item/generator", -1, self->x, self->y, 0); setEntityAnimationByID(self, self->health); } else { setInfoBoxMessage(60, 255, 255, 255, _("%s is required"), _(self->requires)); } } }
void fireMapTrigger(char *name) { int i; char message[MAX_MESSAGE_LENGTH]; if (strlen(name) == 0) { return; } for (i=0;i<MAX_TRIGGERS;i++) { if (trigger[i].inUse == TRUE && strcmpignorecase(trigger[i].triggerName, name) == 0) { trigger[i].count++; if (trigger[i].targetType == UPDATE_OBJECTIVE) { snprintf(message, MAX_MESSAGE_LENGTH, "%s (%d / %d)", _(trigger[i].targetName), trigger[i].count, trigger[i].total); freeMessageQueue(); setInfoBoxMessage(60, 255, 255, 255, message); } if (trigger[i].count == trigger[i].total) { switch (trigger[i].targetType) { case UPDATE_OBJECTIVE: updateObjective(trigger[i].targetName); break; case ACTIVATE_ENTITY: activateEntitiesWithRequiredName(trigger[i].targetName, TRUE); break; case DEACTIVATE_ENTITY: activateEntitiesWithRequiredName(trigger[i].targetName, FALSE); break; case RUN_SCRIPT: runScript(trigger[i].targetName); break; case KILL_ENTITY: killEntity(trigger[i].targetName); break; case REMOVE_INVENTORY_ITEM: removeInventoryItemByObjectiveName(trigger[i].targetName); break; default: break; } trigger[i].inUse = FALSE; } } } }
static void eatAttackWait() { Entity *temp; if (self->face == LEFT) { player.x = self->x + self->w - player.w - self->offsetX; } else { player.x = self->x + self->offsetX; } player.y = self->y + self->offsetY; self->thinkTime--; if (self->thinkTime <= 0) { temp = self; self = &player; self->takeDamage(temp, 3); self = temp; self->thinkTime = 60; if (player.health <= 0) { removeInventoryItemByObjectiveName("Amulet of Resurrection"); self->action = &attackFinished; } } if (self->health <= self->mental) { setEntityAnimation(self, "SPIT_OUT"); if (self->face == LEFT) { player.x = self->x + self->w - player.w - self->offsetX; } else { player.x = self->x + self->offsetX; } player.y = self->y + self->offsetY; setCustomAction(&player, &invulnerable, 60, 0, 0); setPlayerStunned(30); player.x -= player.dirX; player.y -= player.dirY; player.dirX = (10 + prand() % 3) * (self->face == LEFT ? -1 : 1); player.dirY = -3; self->touch = &touch; self->flags &= ~GRABBING; self->thinkTime = 60; self->action = &eatAttackFinish; } self->maxThinkTime--; checkToMap(self); }