void slimeDie(Entity *my) { Entity *entity; int c = 0; for( c=0; c<5; c++ ) { Entity *gib = spawnGib(my); serverSpawnGibForClient(gib); } if (spawn_blood) { int x, y; x = std::min<unsigned int>(std::max<int>(0,my->x/16),map.width-1); y = std::min<unsigned int>(std::max<int>(0,my->y/16),map.height-1); if( map.tiles[y*MAPLAYERS+x*MAPLAYERS*map.height] ) { if( !checkObstacle(my->x,my->y,my,NULL) ) { if( my->sprite == 210 ) entity = newEntity(212,1,map.entities); else entity = newEntity(214,1,map.entities); entity->x = my->x; entity->y = my->y; entity->z = 7.4+(rand()%20)/100.f; entity->parent = my->uid; entity->sizex = 2; entity->sizey = 2; entity->yaw = (rand()%360)*PI/180.0; entity->flags[UPDATENEEDED] = TRUE; entity->flags[PASSABLE] = TRUE; } } } playSoundEntity(my, 69, 64); list_RemoveNode(my->mynode); return; }
void skeletonDie(Entity *my) { node_t *node, *nextnode; int i = 0; for( node=my->children.first; node!=NULL; node=nextnode ) { nextnode = node->next; if( node->element != NULL && i >= 2 ) { Entity *entity=(Entity *)node->element; if( entity->light != NULL ) list_RemoveNode(entity->light->node); entity->light = NULL; list_RemoveNode(entity->mynode); } list_RemoveNode(node); i++; } int c; for( c=0; c<6; c++ ) { Entity *entity = spawnGib(my); if( entity ) { switch( c ) { case 0: entity->sprite = 229; break; case 1: entity->sprite = 230; break; case 2: entity->sprite = 231; break; case 3: entity->sprite = 233; break; case 4: entity->sprite = 235; break; case 5: entity->sprite = 236; break; } serverSpawnGibForClient(entity); } } playSoundEntity(my, 94, 128); list_RemoveNode(my->mynode); return; }
void humanDie(Entity* my) { int c; for ( c = 0; c < 5; c++ ) { Entity* gib = spawnGib(my); serverSpawnGibForClient(gib); } my->spawnBlood(); playSoundEntity(my, 28, 128); my->removeMonsterDeathNodes(); list_RemoveNode(my->mynode); return; }
void gnomeDie(Entity *my) { node_t *node, *nextnode; int c; for( c=0; c<6; c++ ) { Entity *entity = spawnGib(my); if( entity ) serverSpawnGibForClient(entity); } if (spawn_blood) { int x, y; x = std::min<unsigned int>(std::max<int>(0,my->x/16),map.width-1); y = std::min<unsigned int>(std::max<int>(0,my->y/16),map.height-1); if( map.tiles[y*MAPLAYERS+x*MAPLAYERS*map.height] ) { if( !checkObstacle(my->x,my->y,my,NULL) ) { Entity *entity = newEntity(160,1,map.entities); entity->x = my->x; entity->y = my->y; entity->z = 7.4+(rand()%20)/100.f; entity->parent = my->uid; entity->sizex = 2; entity->sizey = 2; entity->yaw = (rand()%360)*PI/180.0; entity->flags[UPDATENEEDED] = TRUE; entity->flags[PASSABLE] = TRUE; } } } int i = 0; for( node=my->children.first; node!=NULL; node=nextnode ) { nextnode = node->next; if( node->element != NULL && i >= 2 ) { Entity *entity=(Entity *)node->element; if( entity->light != NULL ) list_RemoveNode(entity->light->node); entity->light = NULL; list_RemoveNode(entity->mynode); } list_RemoveNode(node); i++; } playSoundEntity(my,225+rand()%4,128); list_RemoveNode(my->mynode); return; }
void minotaurDie(Entity* my) { int c; for ( c = 0; c < 5; c++ ) { Entity* gib = spawnGib(my); serverSpawnGibForClient(gib); } my->spawnBlood(); for ( c = 0; c < MAXPLAYERS; c++ ) { playSoundPlayer(c, 114, 128); } my->removeMonsterDeathNodes(); list_RemoveNode(my->mynode); return; }
void actRightHandMagic(Entity *my) { if (intro == TRUE) { my->flags[INVISIBLE] = TRUE; return; } //Initialize if( !HANDMAGIC_INIT ) { HANDMAGIC_INIT=1; my->focalz = -1.5; } if( players[clientnum]==NULL ) { magicRightHand=NULL; list_RemoveNode(my->mynode); return; } my->x = 8; my->y = 3; my->z = (camera.z *.5 - players[clientnum]->z) + 7; my->z -= 4; my->yaw = HANDMAGIC_YAW - camera_shakex2; double defaultpitch = (0-6.f) / PI; my->pitch = defaultpitch + HANDMAGIC_PITCH - camera_shakey2 / 200.f; my->roll = HANDMAGIC_ROLL; //Sprite bool noGloves=FALSE; if( stats[clientnum].gloves == NULL ) { noGloves=TRUE; } else { if( stats[clientnum].gloves->type == GLOVES || stats[clientnum].gloves->type == GLOVES_DEXTERITY ) { my->sprite = 132 + stats[clientnum].sex; } else if( stats[clientnum].gloves->type == BRACERS || stats[clientnum].gloves->type == BRACERS_CONSTITUTION ) { my->sprite = 323 + stats[clientnum].sex; } else if( stats[clientnum].gloves->type == GAUNTLETS || stats[clientnum].gloves->type == GAUNTLETS_STRENGTH ) { my->sprite = 140 + stats[clientnum].sex; } else { noGloves = TRUE; } } if( noGloves ) { if( stats[clientnum].appearance/6==0 ) { if( stats[clientnum].sex==FEMALE ) { my->sprite = 121; } else { my->sprite = 109; } } else if( stats[clientnum].appearance/6==1 ) { if( stats[clientnum].sex==FEMALE ) { my->sprite = 350; } else { my->sprite = 337; } } else { if( stats[clientnum].sex==FEMALE ) { my->sprite = 376; } else { my->sprite = 363; } } } bool wearingring = FALSE; //Select model if (stats[clientnum].ring != NULL) if (stats[clientnum].ring->type == RING_INVISIBILITY) wearingring = TRUE; if (stats[clientnum].cloak != NULL) if (stats[clientnum].cloak->type == CLOAK_INVISIBILITY) wearingring = TRUE; if (players[clientnum]->skill[3] == 1 || stats[clientnum].EFFECTS[EFF_INVISIBLE] == TRUE || wearingring ) { // debug cam or player invisible my->flags[INVISIBLE] = TRUE; } if (cast_animation.active) { switch (cast_animation.stage) { case CIRCLE: if (ticks%5==0) { //messagePlayer(0, "Pingas!"); Entity *entity = spawnGib(my); entity->flags[INVISIBLE] = FALSE; entity->flags[SPRITE] = TRUE; entity->flags[NOUPDATE] = TRUE; entity->flags[UPDATENEEDED] = FALSE; entity->flags[OVERDRAW] = TRUE; entity->flags[BRIGHT] = TRUE; //entity->sizex = 1; //MAKE 'EM SMALL PLEASE! //entity->sizey = 1; entity->scalex = 0.25f; //MAKE 'EM SMALL PLEASE! entity->scaley = 0.25f; entity->scalez = 0.25f; entity->sprite = 16; //TODO: Originally. 22. 16 -- spark sprite instead? entity->yaw = ((rand()%6)*60)*PI/180.0; entity->pitch = (rand()%360)*PI/180.0; entity->roll = (rand()%360)*PI/180.0; entity->vel_x = cos(entity->yaw)*.1; entity->vel_y = sin(entity->yaw)*.1; entity->vel_z = -.15; entity->fskill[3] = 0.01; } break; case THROW: break; default: break; } } //Final position code. if( players[clientnum] == NULL ) return; //double defaultpitch = PI / 8.f; //double defaultpitch = 0; //double defaultpitch = PI / (0-4.f); defaultpitch = (0-6.f) / PI; //my->x = 6 + HUDWEAPON_MOVEX; my->x = 8; my->x += cast_animation.lefthand_movex; //my->y = 3 + HUDWEAPON_MOVEY; my->y = 3; my->y -= cast_animation.lefthand_movey; //my->z = (camera.z*.5-players[clientnum]->z)+7+HUDWEAPON_MOVEZ; my->z = (camera.z *.5 - players[clientnum]->z) + 7; my->z -= 4; my->yaw = HANDMAGIC_YAW - camera_shakex2; my->pitch = defaultpitch + HANDMAGIC_PITCH - camera_shakey2 / 200.f; my->roll = HANDMAGIC_ROLL; }
void actLeftHandMagic(Entity *my) { //int c = 0; if (intro == TRUE) { my->flags[INVISIBLE] = TRUE; return; } //Initialize if (!HANDMAGIC_INIT) { HANDMAGIC_INIT = 1; HANDMAGIC_TESTVAR = 0; my->focalz = -1.5; } if( players[clientnum]==NULL ) { magicLeftHand = NULL; spellcastingAnimationManager_deactivate(&cast_animation); list_RemoveNode(my->mynode); return; } //Set the initial values. (For the particle spray) my->x = 8; my->y = -3; my->z = (camera.z *.5 - players[clientnum]->z) + 7; my->z -= 4; my->yaw = HANDMAGIC_YAW - camera_shakex2; double defaultpitch = (0-6.f) / PI; my->pitch = defaultpitch + HANDMAGIC_PITCH - camera_shakey2 / 200.f; my->roll = HANDMAGIC_ROLL; //Sprite bool noGloves=FALSE; if( stats[clientnum].gloves == NULL ) { noGloves=TRUE; } else { if( stats[clientnum].gloves->type == GLOVES || stats[clientnum].gloves->type == GLOVES_DEXTERITY ) { my->sprite = 136 + stats[clientnum].sex; } else if( stats[clientnum].gloves->type == BRACERS || stats[clientnum].gloves->type == BRACERS_CONSTITUTION ) { my->sprite = 327 + stats[clientnum].sex; } else if( stats[clientnum].gloves->type == GAUNTLETS || stats[clientnum].gloves->type == GAUNTLETS_STRENGTH ) { my->sprite = 144 + stats[clientnum].sex; } else { noGloves = TRUE; } } if( noGloves ) { if( stats[clientnum].appearance/6==0 ) { if( stats[clientnum].sex==FEMALE ) { my->sprite = 122; } else { my->sprite = 110; } } else if( stats[clientnum].appearance/6==1 ) { if( stats[clientnum].sex==FEMALE ) { my->sprite = 351; } else { my->sprite = 338; } } else { if( stats[clientnum].sex==FEMALE ) { my->sprite = 377; } else { my->sprite = 364; } } } bool wearingring = FALSE; //Select model if (stats[clientnum].ring != NULL) if (stats[clientnum].ring->type == RING_INVISIBILITY) wearingring = TRUE; if (stats[clientnum].cloak != NULL) if (stats[clientnum].cloak->type == CLOAK_INVISIBILITY) wearingring = TRUE; if (players[clientnum]->skill[3] == 1 || stats[clientnum].EFFECTS[EFF_INVISIBLE] == TRUE || wearingring ) { // debug cam or player invisible my->flags[INVISIBLE] = TRUE; } if (cast_animation.active) { switch (cast_animation.stage) { case CIRCLE: if(ticks%5==0) { Entity *entity = spawnGib(my); entity->flags[INVISIBLE] = FALSE; entity->flags[SPRITE] = TRUE; entity->flags[NOUPDATE] = TRUE; entity->flags[UPDATENEEDED] = FALSE; entity->flags[OVERDRAW] = TRUE; entity->flags[BRIGHT] = TRUE; entity->scalex = 0.25f; //MAKE 'EM SMALL PLEASE! entity->scaley = 0.25f; entity->scalez = 0.25f; entity->sprite = 16; //TODO: Originally. 22. 16 -- spark sprite instead? entity->yaw = ((rand()%6)*60)*PI/180.0; entity->pitch = (rand()%360)*PI/180.0; entity->roll = (rand()%360)*PI/180.0; entity->vel_x = cos(entity->yaw)*.1; entity->vel_y = sin(entity->yaw)*.1; entity->vel_z = -.15; entity->fskill[3] = 0.01; } cast_animation.consume_timer--; if (cast_animation.consume_timer < 0 && cast_animation.mana_left > 0) { //Time to consume mana and reset the ticker! cast_animation.consume_timer = cast_animation.consume_interval; if (multiplayer == SINGLE) { players[clientnum]->drainMP(1); } cast_animation.mana_left--; } cast_animation.lefthand_angle += HANDMAGIC_CIRCLE_SPEED; cast_animation.lefthand_movex = cos(cast_animation.lefthand_angle) * HANDMAGIC_CIRCLE_RADIUS; cast_animation.lefthand_movey = sin(cast_animation.lefthand_angle) * HANDMAGIC_CIRCLE_RADIUS; if (cast_animation.lefthand_angle >= 2 * PI) { //Completed one loop. cast_animation.lefthand_angle = 0; cast_animation.circle_count++; if (cast_animation.circle_count >= cast_animation.times_to_circle) //Finished circling. Time to move on! cast_animation.stage++; } break; case THROW: //messagePlayer(clientnum, "IN THROW"); //TODO: Throw animation! Or something. cast_animation.stage++; break; default: //messagePlayer(clientnum, "DEFAULT CASE"); spellcastingAnimationManager_completeSpell(&cast_animation); break; } } //Final position code. if( players[clientnum] == NULL ) return; //double defaultpitch = PI / 8.f; //double defaultpitch = 0; //double defaultpitch = PI / (0-4.f); defaultpitch = (0-6.f) / PI; //my->x = 6 + HUDWEAPON_MOVEX; my->x += cast_animation.lefthand_movex; //my->y = 3 + HUDWEAPON_MOVEY; my->y = -3; my->y += cast_animation.lefthand_movey; //my->z = (camera.z*.5-players[clientnum]->z)+7+HUDWEAPON_MOVEZ; my->z = (camera.z *.5 - players[clientnum]->z) + 7; my->z -= 4; my->yaw = HANDMAGIC_YAW - camera_shakex2; my->pitch = defaultpitch + HANDMAGIC_PITCH - camera_shakey2 / 200.f; my->roll = HANDMAGIC_ROLL; }
void actFountain(Entity *my) { Entity *entity; //messagePlayer(0, "actFountain()"); //TODO: Temporary mechanism testing code. /* if( multiplayer != CLIENT ) { if (my->skill[28]) { //All it does is change its sprite to sink if it's powered. if (my->skill[28] == 1) { my->sprite = 163; } else { my->sprite = 164; } } }*/ //****************END TEST CODE*************** //TODO: Sounds. // spray water if( my->skill[0] > 0 || ( !my->skill[2] && multiplayer == CLIENT ) ) { #define FOUNTAIN_AMBIENCE my->skill[7] FOUNTAIN_AMBIENCE--; if( FOUNTAIN_AMBIENCE<=0 ) { FOUNTAIN_AMBIENCE = TICKS_PER_SECOND*6; playSoundEntityLocal(my, 135, 32 ); } entity = spawnGib(my); entity->flags[INVISIBLE] = FALSE; entity->y -= 2; entity->z -= 8; entity->flags[SPRITE] = FALSE; entity->flags[NOUPDATE] = TRUE; entity->flags[UPDATENEEDED] = FALSE; entity->skill[4] = 7; entity->sprite = 4; entity->yaw = (rand()%360)*PI/180.0; entity->pitch = (rand()%360)*PI/180.0; entity->roll = (rand()%360)*PI/180.0; entity->vel_x = 0; entity->vel_y = 0; entity->vel_z = .25; entity->fskill[3] = 0.03; } // the rest of the function is server-side. if( multiplayer==CLIENT ) return; // makes the fountain stop spraying water on clients if( my->skill[0] <= 0 ) my->skill[2] = 1; else my->skill[2] = 0; //Using the fountain (TODO: Monsters using it?). int i; for (i = 0; i < MAXPLAYERS; ++i) { if ( (i==0 && selectedEntity==my) || (client_selected[i]==my) ) { if (inrange[i]) { //Act on it only if the player (or monster, if/when this is changed to support monster interaction?) is in range. //First check that it's not depleted. if (my->skill[0] == 0) { //Depleted messagePlayer(i, language[467]); } else { if (players[i]->entity->flags[BURNING]) { messagePlayer(i, language[468]); players[i]->entity->flags[BURNING] = FALSE; if (i > 0) serverUpdateEntityFlag(players[i]->entity, BURNING); } switch (my->skill[1]) { case 0: { playSoundEntity(players[i]->entity, 52, 64); //Spawn succubus. Uint32 color = SDL_MapRGB(mainsurface->format,255,128,0); messagePlayerColor(i, color, language[469]); summonMonster(SUCCUBUS, my->x, my->y); break; } case 1: messagePlayer(i, language[470]); messagePlayer(i, language[471]); playSoundEntity(players[i]->entity, 52, 64); stats[i]->HUNGER += 50; break; case 2: { //Potion effect. Potion effect is stored in my->skill[3], randomly chosen when the fountain is created. messagePlayer(i, language[470]); Item *item = newItem(static_cast<ItemType>(POTION_WATER+my->skill[3]), static_cast<Status>(4), 0,1,0,FALSE,NULL); useItem(item,i); // Long live the mystical fountain of TODO. break; } case 3: { // bless equipment playSoundEntity(players[i]->entity, 52, 64); Uint32 textcolor = SDL_MapRGB(mainsurface->format,0,255,255); messagePlayerColor(i, textcolor, language[471]); messagePlayer(i, language[473]); if( stats[i]->helmet ) stats[i]->helmet->beatitude++; if( stats[i]->breastplate ) stats[i]->breastplate->beatitude++; if( stats[i]->gloves ) stats[i]->gloves->beatitude++; if( stats[i]->shoes ) stats[i]->shoes->beatitude++; if( stats[i]->shield ) stats[i]->shield->beatitude++; if( stats[i]->weapon ) stats[i]->weapon->beatitude++; if( stats[i]->cloak ) stats[i]->cloak->beatitude++; if( stats[i]->amulet ) stats[i]->amulet->beatitude++; if( stats[i]->ring ) stats[i]->ring->beatitude++; if( stats[i]->mask ) stats[i]->mask->beatitude++; if( multiplayer==SERVER && i>0 ) { strcpy((char *)net_packet->data,"BLES"); net_packet->address.host = net_clients[i-1].host; net_packet->address.port = net_clients[i-1].port; net_packet->len = 4; sendPacketSafe(net_sock, -1, net_packet, i-1); } break; } default: break; } messagePlayer(i, language[474]); my->skill[0] = 0; //Dry up fountain. //TODO: messagePlayersInSight() instead. } //Then perform the effect randomly determined when the fountain was created. return; } } } }
void actFountain(Entity* my) { Entity* entity; //messagePlayer(0, "actFountain()"); //TODO: Temporary mechanism testing code. /* if( multiplayer != CLIENT ) { if (my->skill[28]) { //All it does is change its sprite to sink if it's powered. if (my->skill[28] == 1) { my->sprite = 163; } else { my->sprite = 164; } } }*/ //****************END TEST CODE*************** //TODO: Sounds. // spray water if ( my->skill[0] > 0 ) { #define FOUNTAIN_AMBIENCE my->skill[7] FOUNTAIN_AMBIENCE--; if ( FOUNTAIN_AMBIENCE <= 0 ) { FOUNTAIN_AMBIENCE = TICKS_PER_SECOND * 6; playSoundEntityLocal(my, 135, 32 ); } entity = spawnGib(my); entity->flags[INVISIBLE] = false; entity->y -= 2; entity->z -= 8; entity->flags[SPRITE] = false; entity->flags[NOUPDATE] = true; entity->flags[UPDATENEEDED] = false; entity->skill[4] = 7; entity->sprite = 4; entity->yaw = (rand() % 360) * PI / 180.0; entity->pitch = (rand() % 360) * PI / 180.0; entity->roll = (rand() % 360) * PI / 180.0; entity->vel_x = 0; entity->vel_y = 0; entity->vel_z = .25; entity->fskill[3] = 0.03; } // the rest of the function is server-side. if ( multiplayer == CLIENT ) { return; } //Using the fountain (TODO: Monsters using it?). int i; for (i = 0; i < MAXPLAYERS; ++i) { if ( (i == 0 && selectedEntity == my) || (client_selected[i] == my) ) { if (inrange[i]) //Act on it only if the player (or monster, if/when this is changed to support monster interaction?) is in range. { //First check that it's not depleted. if (my->skill[0] == 0) { //Depleted messagePlayer(i, language[467]); } else { if (players[i]->entity->flags[BURNING]) { messagePlayer(i, language[468]); players[i]->entity->flags[BURNING] = false; serverUpdateEntityFlag(players[i]->entity, BURNING); steamAchievementClient(i, "BARONY_ACH_HOT_SHOWER"); } switch (my->skill[1]) { case 0: { playSoundEntity(players[i]->entity, 52, 64); //Spawn succubus. Uint32 color = SDL_MapRGB(mainsurface->format, 255, 128, 0); Entity* spawnedMonster = nullptr; if ( !strncmp(map.name, "Underworld", 10) ) { Monster creature = SUCCUBUS; if ( rand() % 2 ) { creature = INCUBUS; } for ( int c = 0; spawnedMonster == nullptr && c < 5; ++c ) { switch ( c ) { case 0: spawnedMonster = summonMonster(creature, my->x, my->y); break; case 1: spawnedMonster = summonMonster(creature, my->x + 16, my->y); break; case 2: spawnedMonster = summonMonster(creature, my->x - 16, my->y); break; case 3: spawnedMonster = summonMonster(creature, my->x, my->y + 16); break; case 4: spawnedMonster = summonMonster(creature, my->x, my->y - 16); break; } } if ( spawnedMonster ) { if ( creature == INCUBUS ) { messagePlayerColor(i, color, language[2519]); Stat* tmpStats = spawnedMonster->getStats(); if ( tmpStats ) { strcpy(tmpStats->name, "lesser incubus"); } } else { messagePlayerColor(i, color, language[469]); } } } else if ( currentlevel < 10 ) { messagePlayerColor(i, color, language[469]); spawnedMonster = summonMonster(SUCCUBUS, my->x, my->y); } else if ( currentlevel < 20 ) { if ( rand() % 2 ) { spawnedMonster = summonMonster(INCUBUS, my->x, my->y); Stat* tmpStats = spawnedMonster->getStats(); if ( tmpStats ) { strcpy(tmpStats->name, "lesser incubus"); } messagePlayerColor(i, color, language[2519]); } else { messagePlayerColor(i, color, language[469]); spawnedMonster = summonMonster(SUCCUBUS, my->x, my->y); } } else { messagePlayerColor(i, color, language[2519]); spawnedMonster = summonMonster(INCUBUS, my->x, my->y); } break; } case 1: messagePlayer(i, language[470]); messagePlayer(i, language[471]); playSoundEntity(players[i]->entity, 52, 64); stats[i]->HUNGER += 100; players[i]->entity->modHP(5); break; case 2: { //Potion effect. Potion effect is stored in my->skill[3], randomly chosen when the fountain is created. messagePlayer(i, language[470]); Item* item = newItem(static_cast<ItemType>(POTION_WATER + my->skill[3]), static_cast<Status>(4), 0, 1, 0, false, NULL); useItem(item, i); // Long live the mystical fountain of TODO. break; } case 3: { // bless all equipment playSoundEntity(players[i]->entity, 52, 64); Uint32 textcolor = SDL_MapRGB(mainsurface->format, 0, 255, 255); messagePlayerColor(i, textcolor, language[471]); messagePlayer(i, language[473]); if ( stats[i]->helmet ) { stats[i]->helmet->beatitude++; } if ( stats[i]->breastplate ) { stats[i]->breastplate->beatitude++; } if ( stats[i]->gloves ) { stats[i]->gloves->beatitude++; } if ( stats[i]->shoes ) { stats[i]->shoes->beatitude++; } if ( stats[i]->shield ) { stats[i]->shield->beatitude++; } if ( stats[i]->weapon ) { stats[i]->weapon->beatitude++; } if ( stats[i]->cloak ) { stats[i]->cloak->beatitude++; } if ( stats[i]->amulet ) { stats[i]->amulet->beatitude++; } if ( stats[i]->ring ) { stats[i]->ring->beatitude++; } if ( stats[i]->mask ) { stats[i]->mask->beatitude++; } if ( multiplayer == SERVER && i > 0 ) { strcpy((char*)net_packet->data, "BLES"); net_packet->address.host = net_clients[i - 1].host; net_packet->address.port = net_clients[i - 1].port; net_packet->len = 4; sendPacketSafe(net_sock, -1, net_packet, i - 1); } break; } case 4: { // bless one piece of equipment playSoundEntity(players[i]->entity, 52, 64); Uint32 textcolor = SDL_MapRGB(mainsurface->format, 0, 255, 255); messagePlayerColor(i, textcolor, language[471]); //Choose only one piece of equipment to bless. //First, Figure out what equipment is available. std::vector<std::pair<Item*, Uint32>> items; if ( stats[i]->helmet ) { items.push_back(std::pair<Item*,int>(stats[i]->helmet, 0)); } if ( stats[i]->breastplate ) { items.push_back(std::pair<Item*,int>(stats[i]->breastplate, 1)); } if ( stats[i]->gloves ) { items.push_back(std::pair<Item*,int>(stats[i]->gloves, 2)); } if ( stats[i]->shoes ) { items.push_back(std::pair<Item*,int>(stats[i]->shoes, 3)); } if ( stats[i]->shield ) { items.push_back(std::pair<Item*,int>(stats[i]->shield, 4)); } if ( stats[i]->weapon ) { items.push_back(std::pair<Item*,int>(stats[i]->weapon, 5)); } if ( stats[i]->cloak ) { items.push_back(std::pair<Item*,int>(stats[i]->cloak, 6)); } if ( stats[i]->amulet ) { items.push_back(std::pair<Item*,int>(stats[i]->amulet, 7)); } if ( stats[i]->ring ) { items.push_back(std::pair<Item*,int>(stats[i]->ring, 8)); } if ( stats[i]->mask ) { items.push_back(std::pair<Item*,int>(stats[i]->mask, 9)); } if ( items.size() ) { messagePlayer(i, language[2592]); //"The fountain blesses a piece of equipment" //Randomly choose a piece of equipment. std::pair<Item*, Uint32> chosen = items[rand()%items.size()]; chosen.first->beatitude++; if ( multiplayer == SERVER && i > 0 ) { strcpy((char*)net_packet->data, "BLE1"); SDLNet_Write32(chosen.second, &net_packet->data[4]); net_packet->address.host = net_clients[i - 1].host; net_packet->address.port = net_clients[i - 1].port; net_packet->len = 8; sendPacketSafe(net_sock, -1, net_packet, i - 1); } } //Does nothing if no valid items. break; } default: break; } messagePlayer(i, language[474]); my->skill[0] = 0; //Dry up fountain. serverUpdateEntitySkill(my, my->skill[0]); //TODO: messagePlayersInSight() instead. } //Then perform the effect randomly determined when the fountain was created. return; } } } }
void actMinotaurCeilingBuster(Entity* my) { double x, y; // levitate particles int u = std::min<unsigned int>(std::max<int>(0, my->x / 16), map.width - 1); int v = std::min<unsigned int>(std::max<int>(0, my->y / 16), map.height - 1); if ( !map.tiles[v * MAPLAYERS + u * MAPLAYERS * map.height] ) { int c; for ( c = 0; c < 2; c++ ) { Entity* entity = newEntity(171, 1, map.entities, nullptr); //Particle entity. entity->x = my->x - 8 + rand() % 17; entity->y = my->y - 8 + rand() % 17; entity->z = 10 + rand() % 3; entity->scalex = 0.7; entity->scaley = 0.7; entity->scalez = 0.7; entity->sizex = 1; entity->sizey = 1; entity->yaw = (rand() % 360) * PI / 180.f; entity->flags[PASSABLE] = true; entity->flags[BRIGHT] = true; entity->flags[NOUPDATE] = true; entity->flags[UNCLICKABLE] = true; entity->behavior = &actMagicParticle; if ( multiplayer != CLIENT ) { entity_uids--; } entity->setUID(-3); } } // bust ceilings for ( x = my->x - my->sizex - 1; x <= my->x + my->sizex + 1; x += 1 ) { for ( y = my->y - my->sizey - 1; y <= my->y + my->sizey + 1; y += 1 ) { if ( x >= 0 && y >= 0 && x < map.width << 4 && y < map.height << 4 ) { int index = (MAPLAYERS - 1) + ((int)floor(y / 16)) * MAPLAYERS + ((int)floor(x / 16)) * MAPLAYERS * map.height; if ( map.tiles[index] ) { if ( my->monsterAttack == 0 ) { if ( multiplayer != CLIENT ) { my->attack(MONSTER_POSE_MELEE_WINDUP2, 0, nullptr); } return; } else if ( my->monsterAttack == MONSTER_POSE_MELEE_WINDUP2 ) { return; } map.tiles[index] = 0; if ( multiplayer != CLIENT ) { playSoundEntity(my, 67, 128); //MONSTER_ATTACK = 1; Stat* myStats = my->getStats(); if ( myStats ) { // easy hack to stop the minotaur while he breaks stuff myStats->EFFECTS[EFF_PARALYZED] = true; myStats->EFFECTS_TIMERS[EFF_PARALYZED] = 10; } } // spawn several rock particles (NOT items) int c, i = 6 + rand() % 4; for ( c = 0; c < i; c++ ) { Entity *entity = nullptr; if ( multiplayer == SERVER ) { entity = spawnGib(my); } else { entity = spawnGibClient(my->x, my->y, my->z, 5); } if ( entity ) { entity->x = ((int)(my->x / 16)) * 16 + rand() % 16; entity->y = ((int)(my->y / 16)) * 16 + rand() % 16; entity->z = -8; entity->flags[PASSABLE] = true; entity->flags[INVISIBLE] = false; entity->flags[NOUPDATE] = true; entity->flags[UPDATENEEDED] = false; entity->sprite = items[GEM_ROCK].index; entity->yaw = rand() % 360 * PI / 180; entity->pitch = rand() % 360 * PI / 180; entity->roll = rand() % 360 * PI / 180; entity->vel_x = (rand() % 20 - 10) / 10.0; entity->vel_y = (rand() % 20 - 10) / 10.0; entity->vel_z = -.25; entity->fskill[3] = 0.03; } } } node_t* node, *nextnode; std::vector<list_t*> entLists = TileEntityList.getEntitiesWithinRadiusAroundEntity(my, 2); for ( std::vector<list_t*>::iterator it = entLists.begin(); it != entLists.end(); ++it ) { list_t* currentList = *it; for ( node = currentList->first; node != nullptr; node = nextnode ) { nextnode = node->next; Entity* entity = (Entity*)node->element; if ( (int)(x / 16) == (int)(entity->x / 16) && (int)(y / 16) == (int)(entity->y / 16) ) { if ( entity->behavior == &actDoorFrame ) { // spawn several rock items int c, i = 8 + rand() % 4; for ( c = 0; c < i; c++ ) { Entity *entity = nullptr; if ( multiplayer == SERVER ) { entity = spawnGib(my); } else { entity = spawnGibClient(my->x, my->y, my->z, 5); } if ( entity ) { entity->x = ((int)(my->x / 16)) * 16 + rand() % 16; entity->y = ((int)(my->y / 16)) * 16 + rand() % 16; entity->z = -8; entity->flags[PASSABLE] = true; entity->flags[INVISIBLE] = false; entity->flags[NOUPDATE] = true; entity->flags[UPDATENEEDED] = false; entity->sprite = items[GEM_ROCK].index; entity->yaw = rand() % 360 * PI / 180; entity->pitch = rand() % 360 * PI / 180; entity->roll = rand() % 360 * PI / 180; entity->vel_x = (rand() % 20 - 10) / 10.0; entity->vel_y = (rand() % 20 - 10) / 10.0; entity->vel_z = -.25; entity->fskill[3] = 0.03; } } list_RemoveNode(entity->mynode); } else if ( entity->behavior == &actDoor ) { if ( multiplayer != CLIENT ) { entity->skill[4] = 0; // destroy the door } } else if ( entity->behavior == &actGate ) { if ( multiplayer != CLIENT ) { playSoundEntity(entity, 76, 64); list_RemoveNode(entity->mynode); } } else if ( entity->behavior == &actStalagCeiling || entity->behavior == &actStalagFloor || entity->behavior == &actStalagColumn ) { // spawn several rock items int c, i = rand() % 4; for ( c = 0; c < i; ++c ) { //Entity* childEntity = spawnGib(my); Entity *childEntity = nullptr; if ( multiplayer == SERVER ) { childEntity = spawnGib(my); } else { childEntity = spawnGibClient(my->x, my->y, my->z, 5); } if ( entity ) { childEntity->x = ((int)(my->x / 16)) * 16 + rand() % 16; childEntity->y = ((int)(my->y / 16)) * 16 + rand() % 16; childEntity->z = -8; childEntity->flags[PASSABLE] = true; childEntity->flags[INVISIBLE] = false; childEntity->flags[NOUPDATE] = true; childEntity->flags[UPDATENEEDED] = false; childEntity->sprite = items[GEM_ROCK].index; childEntity->yaw = rand() % 360 * PI / 180; childEntity->pitch = rand() % 360 * PI / 180; childEntity->roll = rand() % 360 * PI / 180; childEntity->vel_x = (rand() % 20 - 10) / 10.0; childEntity->vel_y = (rand() % 20 - 10) / 10.0; childEntity->vel_z = -.25; childEntity->fskill[3] = 0.03; } } list_RemoveNode(entity->mynode); } } } } } } } }
int boulderCheckAgainstEntity(Entity *my, Entity *entity) { if (!my || !entity) return 0; if( entity->behavior == &actPlayer || entity->behavior == &actMonster ) { if( entityInsideEntity( my, entity ) ) { Stat *stats = entity->getStats(); if( stats ) { if( entity->behavior==&actPlayer ) { Uint32 color = SDL_MapRGB(mainsurface->format,255,0,0); messagePlayerColor(entity->skill[2],color,language[455]); if( entity->skill[2] == clientnum ) { camera_shakex += .1; camera_shakey += 10; } else { strcpy((char *)net_packet->data,"SHAK"); net_packet->data[4]=10; // turns into .1 net_packet->data[5]=10; net_packet->address.host = net_clients[entity->skill[2]-1].host; net_packet->address.port = net_clients[entity->skill[2]-1].port; net_packet->len = 6; sendPacketSafe(net_sock, -1, net_packet, entity->skill[2]-1); } } playSoundEntity(my,181,128); playSoundEntity(entity,28,64); spawnGib(entity); entity->modHP(-80); entity->setObituary(language[1505]); if( entity->behavior==&actPlayer ) if( stats->HP<=0 ) steamAchievementClient(entity->skill[2],"BARONY_ACH_THROW_ME_THE_WHIP"); if( stats->HP > 0 ) { // spawn several rock items int i = 8+rand()%4; int c; for( c=0; c<i; c++ ) { Entity *entity = newEntity(-1,1,map.entities); entity->flags[INVISIBLE]=TRUE; entity->flags[UPDATENEEDED]=TRUE; entity->x = my->x - 4 + rand()%8; entity->y = my->y - 4 + rand()%8; entity->z = -6+rand()%12; entity->sizex = 4; entity->sizey = 4; entity->yaw = rand()%360 * PI/180; entity->vel_x = (rand()%20-10)/10.0; entity->vel_y = (rand()%20-10)/10.0; entity->vel_z = -.25 - (rand()%5)/10.0; entity->flags[PASSABLE] = TRUE; entity->behavior = &actItem; entity->flags[USERFLAG1] = TRUE; // no collision: helps performance entity->skill[10] = GEM_ROCK; // type entity->skill[11] = WORN; // status entity->skill[12] = 0; // beatitude entity->skill[13] = 1; // count entity->skill[14] = 0; // appearance entity->skill[15] = FALSE; // identified } double ox = my->x; double oy = my->y; // destroy the boulder playSoundEntity(my,67,128); list_RemoveNode(my->mynode); // on sokoban, destroying boulders spawns scorpions if( !strcmp(map.name,"Sokoban") ) { Entity *monster = summonMonster(SCORPION,ox,oy); if( monster ) { int c; for( c=0; c<MAXPLAYERS; c++ ) { Uint32 color = SDL_MapRGB(mainsurface->format,255,128,0); messagePlayerColor(c,color,language[406]); } } } return 1; } } } } else if( entity->behavior == &actGate || entity->behavior == &actBoulder || entity->behavior==&actChest || entity->behavior==&actHeadstone || entity->behavior==&actFountain || entity->behavior==&actSink ) { if( !entity->flags[PASSABLE] ) { if( entityInsideEntity( my, entity ) ) { // stop the boulder BOULDER_STOPPED=1; BOULDER_ROLLING=0; playSoundEntity(my,181,128); if( my->flags[PASSABLE] ) { my->flags[PASSABLE] = FALSE; if( multiplayer==SERVER ) serverUpdateEntityFlag(my,PASSABLE); } } } } else if( entity->behavior == &actDoor ) { if( entityInsideEntity( my, entity ) ) { playSoundEntity(entity,28,64); entity->skill[4] = 0; if( !entity->skill[0] ) entity->skill[6] = (my->x > entity->x); else entity->skill[6] = (my->y < entity->y); playSoundEntity(my,181,128); } } return 0; }