Initial commit
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
/*
|
||||
hm_gameserver - hearthmod gameserver
|
||||
Copyright (C) 2016 Filip Pancik
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <game.h>
|
||||
|
||||
int game_start(struct conn_client_s *c)
|
||||
{
|
||||
struct powerhistory_entity_s *full, *mana_card = NULL;
|
||||
struct powerhistory_game_entity_s *ge1, *ge2, *ge_main;
|
||||
struct powerhistory_tag_s *p1_tags, *p2_tags, *game_tags, *card_tags;
|
||||
struct powerhistory_player_s *players = NULL;
|
||||
struct powerhistory_creategame_s *game_start;
|
||||
struct powerhistory_data_s *data = NULL;
|
||||
struct powerhistory_s *ph;
|
||||
struct packet_s *p, *p1;
|
||||
const struct ent_s *ent1, *ent2, *ent_game, *ent_nocard;
|
||||
char out[8192], *ptr;
|
||||
int i;
|
||||
|
||||
ent1 = find_entity("PLAYER1", 7);
|
||||
ent2 = find_entity("PLAYER2", 7);
|
||||
|
||||
if(ent1 == NULL || ent2 == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
p1_tags = default_tags(NULL, ent1, 0);
|
||||
p2_tags = default_tags(NULL, ent2, 0);
|
||||
add_tag(&p1_tags, ENTITY_ID, 2);
|
||||
add_tag(&p2_tags, ENTITY_ID, 3);
|
||||
add_tag(&p1_tags, CONTROLLER, 1);
|
||||
add_tag(&p2_tags, CONTROLLER, 2);
|
||||
add_game_entity(&ge1, p1_tags, 2);
|
||||
add_game_entity(&ge2, p2_tags, 3);
|
||||
|
||||
struct hs_holder_s *holder;
|
||||
struct deck_s *deck;
|
||||
holder = c->data;
|
||||
|
||||
add_player(&players, 1, 0x200000257544347, holder->deck->bnet_hi, 0, ge1);
|
||||
add_player(&players, 2, 0x200000257544347, holder->opponent.deck->bnet_hi, 0, ge2);
|
||||
|
||||
//add_player(&players, 1, 0x200000257544347, 0x4ab3967, 0, ge1);
|
||||
//add_player(&players, 2, 0x200000257544347, 0x49E8Eb5, 0, ge2);
|
||||
|
||||
ent_game = find_entity("GAME_ENTITY", 11);
|
||||
game_tags = default_tags(NULL, ent_game, 0);
|
||||
add_tag(&game_tags, ENTITY_ID, 1);
|
||||
add_game_entity(&ge_main, game_tags, 1);
|
||||
|
||||
add_game_start(&game_start, ge_main, players);
|
||||
|
||||
add_ph_data(&data, NULL, game_start);
|
||||
|
||||
//prepare_decks(c);
|
||||
//setup_cards(c);
|
||||
|
||||
|
||||
assert(holder->deck != holder->opponent.deck);
|
||||
|
||||
ent_nocard = find_entity("NO_CARD", 7);
|
||||
assert(ent_nocard);
|
||||
|
||||
deck = holder->deck;
|
||||
for(i = 0; i < deck->ncards; i++) {
|
||||
if(flag(&deck->cards[i]->state, CARD_HERO, FLAG_ISSET) || flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(flag(&deck->cards[i]->state, CARD_HAND, FLAG_ISSET)) {
|
||||
assert(deck->cards[i]->entity);
|
||||
card_tags = default_tags(deck->cards[i], deck->cards[i]->entity, 0);
|
||||
add_tag(&card_tags, ZONE, ZONE_HAND);
|
||||
add_tag(&card_tags, ZONE_POSITION, deck->cards[i]->zone_position);
|
||||
} else {
|
||||
card_tags = default_tags(NULL, ent_nocard, 0);
|
||||
}
|
||||
|
||||
add_tag(&card_tags, CONTROLLER, deck->controller);
|
||||
add_tag(&card_tags, ENTITY_ID, deck->cards[i]->id);
|
||||
|
||||
if(flag(&deck->cards[i]->state, CARD_HAND, FLAG_ISSET)) {
|
||||
add_full_entity(&full, card_tags, deck->cards[i]->id, deck->cards[i]->entity->name, deck->cards[i]->entity->nname);
|
||||
} else {
|
||||
add_full_entity(&full, card_tags, deck->cards[i]->id, NULL, 0);
|
||||
}
|
||||
|
||||
if(deck->cards[i]->id == 68) {
|
||||
mana_card = full;
|
||||
} else {
|
||||
add_ph_data(&data, full, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
deck = holder->opponent.deck;
|
||||
|
||||
for(i = 0; i < deck->ncards; i++) {
|
||||
if(flag(&deck->cards[i]->state, CARD_HERO, FLAG_ISSET) || flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
card_tags = NULL;
|
||||
if(flag(&deck->cards[i]->state, CARD_HAND, FLAG_ISSET)) {
|
||||
add_tag(&card_tags, ZONE, ZONE_HAND);
|
||||
add_tag(&card_tags, ZONE_POSITION, deck->cards[i]->zone_position);
|
||||
} else {
|
||||
add_tag(&card_tags, ZONE, ZONE_DECK);
|
||||
}
|
||||
add_tag(&card_tags, CONTROLLER, deck->controller);
|
||||
add_tag(&card_tags, ENTITY_ID, deck->cards[i]->id);
|
||||
|
||||
add_full_entity(&full, card_tags, deck->cards[i]->id, NULL, 0);
|
||||
|
||||
if(deck->cards[i]->id == 68) {
|
||||
mana_card = full;
|
||||
} else {
|
||||
add_ph_data(&data, full, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
deck = holder->deck;
|
||||
for(i = 0; i < deck->ncards; i++) {
|
||||
if(flag(&deck->cards[i]->state, CARD_HERO, FLAG_ISSET) || flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) {
|
||||
card_tags = NULL;
|
||||
card_tags = default_tags(deck->cards[i], deck->cards[i]->entity, 0);
|
||||
add_tag(&card_tags, CONTROLLER, deck->controller);
|
||||
add_tag(&card_tags, ENTITY_ID, deck->cards[i]->id);
|
||||
add_tag(&card_tags, ZONE, 1);
|
||||
|
||||
if(flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) add_tag(&card_tags, CREATOR, deck->hero->id);
|
||||
|
||||
add_full_entity(&full, card_tags, deck->cards[i]->id, deck->cards[i]->entity->name, deck->cards[i]->entity->nname);
|
||||
add_ph_data(&data, full, NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
deck = holder->opponent.deck;
|
||||
for(i = 0; i < deck->ncards; i++) {
|
||||
if(flag(&deck->cards[i]->state, CARD_HERO, FLAG_ISSET) || flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) {
|
||||
card_tags = NULL;
|
||||
card_tags = default_tags(deck->cards[i], deck->cards[i]->entity, 0);
|
||||
add_tag(&card_tags, CONTROLLER, deck->controller);
|
||||
add_tag(&card_tags, ENTITY_ID, deck->cards[i]->id);
|
||||
add_tag(&card_tags, ZONE, 1);
|
||||
|
||||
if(flag(&deck->cards[i]->state, CARD_HEROPOWER, FLAG_ISSET)) add_tag(&card_tags, CREATOR, deck->hero->id);
|
||||
|
||||
add_full_entity(&full, card_tags, deck->cards[i]->id, deck->cards[i]->entity->name, deck->cards[i]->entity->nname);
|
||||
add_ph_data(&data, full, NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
ent_nocard = find_entity("HERO_08", 7);
|
||||
card_tags = default_tags(ent_nocard);
|
||||
add_tag(&card_tags, CONTROLLER, 1);
|
||||
add_tag(&card_tags, ENTITY_ID, 64);
|
||||
add_full_entity(&full, card_tags, 64, "TU4e_001", 8);
|
||||
add_ph_data(&data, full, NULL);
|
||||
|
||||
ent_nocard = find_entity("HERO_09", 7);
|
||||
card_tags = default_tags(ent_nocard);
|
||||
add_tag(&card_tags, CONTROLLER, 2);
|
||||
add_tag(&card_tags, ENTITY_ID, 66);
|
||||
add_full_entity(&full, card_tags, 66, "HERO_09", 7);
|
||||
add_ph_data(&data, full, NULL);
|
||||
*/
|
||||
|
||||
/*
|
||||
ent_nocard = find_entity("CS2_034", 7);
|
||||
card_tags = default_tags(ent_nocard);
|
||||
add_tag(&card_tags, CONTROLLER, 1);
|
||||
add_tag(&card_tags, ENTITY_ID, 65);
|
||||
add_full_entity(&full, card_tags, 65, "CS2_034", 7);
|
||||
add_ph_data(&data, full, NULL);
|
||||
|
||||
ent_nocard = find_entity("CS1h_001", 8);
|
||||
card_tags = default_tags(ent_nocard);
|
||||
add_tag(&card_tags, CONTROLLER, 2);
|
||||
add_tag(&card_tags, ENTITY_ID, 67);
|
||||
add_full_entity(&full, card_tags, 67, "CS1h_001", 8);
|
||||
add_ph_data(&data, full, NULL);
|
||||
*/
|
||||
|
||||
/*
|
||||
ent_nocard = find_entity("GAME_005", 8);
|
||||
card_tags = default_tags(ent_nocard);
|
||||
add_tag(&card_tags, CONTROLLER, 1);
|
||||
add_tag(&card_tags, ENTITY_ID, 68);
|
||||
|
||||
|
||||
if(holder->id == 1) {
|
||||
add_tag(&card_tags, CREATOR, 1);
|
||||
add_tag(&card_tags, CARDTYPE, 5);
|
||||
add_full_entity(&full, card_tags, 68, "GAME_005", 8);
|
||||
} else {
|
||||
add_full_entity(&full, card_tags, 68, NULL, 0);
|
||||
}
|
||||
add_ph_data(&data, full, NULL);
|
||||
*/
|
||||
|
||||
add_ph_data(&data, mana_card, NULL);
|
||||
|
||||
add_ph(&ph, data);
|
||||
add_packet(&p, ph, P_POWERHISTORY);
|
||||
|
||||
powerhistory_dump(ph);
|
||||
|
||||
ptr = out;
|
||||
int n = serialize(p, &ptr, ptr + sizeof(out));
|
||||
packet_free(p);
|
||||
|
||||
data = NULL;
|
||||
ph = NULL;
|
||||
add_tagschange(&data, ent_game, 1);
|
||||
add_tagchange(&data, STEP, 4, 1);
|
||||
|
||||
add_tagschange(&data, ent1, 2);
|
||||
add_tagchange(&data, CONTROLLER, 1, 2);
|
||||
add_tagchange(&data, MULLIGAN_STATE, 1, 2);
|
||||
|
||||
add_tagschange(&data, ent2, 3);
|
||||
add_tagchange(&data, CONTROLLER, 2, 3);
|
||||
|
||||
add_powerstart(&data, 5, -1, 1, 0, NULL, 0);
|
||||
|
||||
add_ph(&ph, data);
|
||||
add_packet(&p1, ph, P_POWERHISTORY);
|
||||
|
||||
ptr = out + n;
|
||||
int n1 = serialize(p1, &ptr, ptr + sizeof(out) - n);
|
||||
packet_free(p1);
|
||||
|
||||
struct entitychoices_s *ec;
|
||||
ec = prepare_choices(holder->deck, holder->id);
|
||||
add_packet(&p1, ec, P_ENTITYCHOICES);
|
||||
|
||||
ptr = out + n + n1;
|
||||
int n2 = serialize(p1, &ptr, ptr + sizeof(out) - n - n1);
|
||||
packet_free(p1);
|
||||
|
||||
//bin_dump(ptr - n2, n2);
|
||||
|
||||
if(holder->id == 1) {
|
||||
ec = prepare_choices(holder->opponent.deck, 2);
|
||||
} else {
|
||||
ec = prepare_choices(holder->opponent.deck, 1);
|
||||
}
|
||||
add_packet(&p1, ec, P_ENTITYCHOICES);
|
||||
ptr = out + n + n1 + n2;
|
||||
int n3 = serialize(p1, &ptr, ptr + sizeof(out) - n - n1 - n2);
|
||||
packet_free(p1);
|
||||
|
||||
//bin_dump(ptr - n3, n3);
|
||||
const char common[19] = { 0x13, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x09, 0x22, 0x07, 0x08, 0x03, 0x10, 0xb1, 0x02, 0x18, 0x01 };
|
||||
memcpy(out + n + n1 + n2 + n3, common, sizeof(common));
|
||||
|
||||
hm_send(c, out, (int)(n + n1 + n2 + n3 + sizeof(common)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user