72 if ( e.classname ==
"minigame_board_piece" && e.netname == tile && ((check_target) ? e.bd_tiletype ==
BD_TILE_TARGET : e.bd_tiletype !=
BD_TILE_TARGET) )
81 if ( e.classname ==
"bd_controller" && e.bd_tilelet == letter )
99 controller.bd_forceupdate =
number;
108 if ( e.classname ==
"minigame_board_piece" && e.bd_tiletype ==
BD_TILE_DOZER )
151NET_HANDLE(ENT_CLIENT_BD_CONTROLLER,
bool isNew)
180 int total = 0, valid = 0;
183 if ( e.classname ==
"minigame_board_piece" && e.bd_tiletype ==
BD_TILE_TARGET )
223 if(bdir ==
"up" || bdir ==
"u")
225 if(bdir ==
"down" || bdir ==
"dn" || bdir ==
"d")
227 if(bdir ==
"left" || bdir ==
"lt" || bdir ==
"l")
229 if(bdir ==
"right" || bdir ==
"rt" || bdir ==
"r")
272 switch(hit.bd_tiletype)
301 switch(controller.bd_tiletypes[tnum])
313 strcpy(hit.netname, testpos);
321 switch(controller.bd_tiletypes[
number])
333 strcpy(dozer.netname, newpos);
360 if ( e.classname ==
"minigame_board_piece" && e.bd_tiletype ==
BD_TILE_DOZER )
385 if ( pos && thetile )
397 found_piece.bd_dir = bdir;
409 if(controller.bd_tiletypes[tnum])
411 controller.bd_tiletypes[tnum] = 0;
412 controller.bd_dirs[tnum] = 0;
435 controller.bd_tiletypes[
number] = thetile;
436 controller.bd_dirs[
number] = 0;
444 piece.bd_tiletype = thetile;
488 if(targ && thetype == targ.bd_tiletype)
493 else if(piece && thetype == piece.bd_tiletype)
509 if(!player.minigame_players.bd_canedit)
511 sprint(player.minigame_players,
"You're not allowed to edit levels, sorry!\n");
518 int thetype =
stof(thetile);
527 if(targ) { killtype = targ.bd_tiletype; }
528 if(piece) { killtype = piece.bd_tiletype; }
551 for(e = minigame.minigame_players; e; e = e.list_next)
555 if ( e.classname ==
"minigame_player" )
568 if(e.classname ==
"minigame_board_piece")
575 if(e.classname ==
"bd_controller")
580 for(
int letter = 0; letter <
BD_LET_CNT; ++letter)
583 controller.owner = minigame;
584 controller.bd_tilelet = letter;
598 if(minigame.bd_nextlevel && minigame.bd_nextlevel !=
"")
600 strcpy(minigame.bd_levelname, minigame.bd_nextlevel);
635 if(!player.minigame_players.bd_canedit)
637 sprint(player.minigame_players,
"You're not allowed to edit levels, sorry!\n");
652 string bd_string =
"";
656 bd_string =
strcat(bd_string,
"\"", tilename,
"\" ");
665 string bd_string =
"";
667 bd_string =
strcat(bd_string,
"\"", e.netname,
"\" ");
668 bd_string =
strcat(bd_string,
ftos(e.bd_tiletype),
" ");
669 bd_string =
strcat(bd_string,
ftos(e.bd_dir));
694 string bd_string = s;
699 string tilename =
strzone(
argv(argv_num)); ++argv_num;
700 int tiletype =
stoi(
argv(argv_num)); ++argv_num;
708 controller.bd_tiletypes[
number] = tiletype;
716 e.netname = tilename;
719 e.bd_tiletype = tiletype;
726 if(minigame.bd_levelname && minigame.bd_levelname !=
"")
728 int target_count = 0, boulder_count = 0;
731 if(piece.classname ==
"minigame_board_piece")
739 if(boulder_count != target_count)
741 LOG_INFO(
"Not enough targets or boulders, fix your level!");
749 file_name =
strcat(
"minigames/bulldozer/storage_", minigame.bd_levelname,
".txt");
751 fputs(file_get,
strcat(
"// bulldozer storage \"", minigame.bd_levelname,
"\" last updated ", strftime(
true,
"%d-%m-%Y %H:%M:%S"),
"\n"));
753 if(minigame.bd_nextlevel && minigame.bd_nextlevel !=
"" &&
fexists(
strcat(
"minigames/bulldozer/storage_", minigame.bd_nextlevel,
".txt")))
754 fputs(file_get,
strcat(
"nextlevel = \"", minigame.bd_nextlevel,
"\"\n"));
758 if ( e.classname ==
"bd_controller" )
769 if ( e.classname ==
"minigame_board_piece" )
785 string file_read, file_name;
788 file_name =
strcat(
"minigames/bulldozer/storage_", minigame.bd_levelname,
".txt");
792 LOG_INFO(
"^3BULLDOZER: ^7could not find storage file ^3", file_name,
"^7, no items were loaded");
798 file_read =
fgets(file_get);
805 if(
substring(file_read, 0, 9) ==
"nextlevel")
820 if(!player.minigame_players.bd_canedit)
822 sprint(player.minigame_players,
"You're not allowed to edit levels, sorry!\n");
830 LOG_INFO(
"You need to place a bulldozer on the level to save it!");
841 LOG_INFO(
"You need to set the level name!");
865 if(e.classname ==
"minigame_board_piece")
872 if(e.classname ==
"bd_controller")
877 strfree(minigame.bd_nextlevel);
878 strfree(minigame.bd_levelname);
933 if ( sent.classname ==
"minigame_board_piece" && (sf &
MINIG_SF_UPDATE) )
966string bd_get_tile_pic(
int tileid)
991 bd_boardsize = mySize;
1001 if(e.classname ==
"minigame_board_piece")
1017 if ( e.classname ==
"bd_controller" )
1021 if(!e.bd_tiletypes[j])
continue;
1023 int letter = e.bd_tilelet;
1029 string thepiece = bd_get_tile_pic(e.bd_tiletypes[j]);
1036 else if ( e.classname ==
"minigame_board_piece" )
1043 string thepiece = bd_get_tile_pic(e.bd_tiletype);
1046 thepiece =
"bd/boulder_target";
1058 if ( e.classname ==
"minigame_board_piece" && e.bd_tiletype ==
BD_TILE_DOZER )
1063 int bdir = e.bd_dir;
1076 tile_size, tile_size/2,
'1 1 1',
1086 string thepiece = ((piece || (targ && bd_curr_tile !=
BD_TILE_BOULDER)) ?
"bd/delete" : bd_get_tile_pic(bd_curr_tile));
1093 tile_size, tile_size/2,
'1 1 1',
1107 string victory_text = _(
"Game over!");
1110 victory_text = _(
"Well done! Click \"Next Level\" to continue");
1112 vector win_pos = pos+
eY*(mySize_y-winfs_y)/2;
1139 ts_y = ( mySize_y - 2*player_fontsize_y ) /
BD_TEAMS;
1142 vector tile_size =
'48 48 0';
1148 mypos_y += player_fontsize_y;
1162 mypos_y += player_fontsize_y;
1163 string thepiece =
"bd/dozer";
1165 thepiece = bd_get_tile_pic(bd_curr_tile);
1166 const float tile_scale = 0.7;
1167 drawpic( mypos + tile_size * 0.5 * (1 - tile_scale),
1171 mypos_x += tile_size_x;
1180string bd_turn_to_string(
int turnflags)
1183 return _(
"You are spectating");
1186 return _(
"Better luck next time!");
1191 return _(
"Tubular! Press \"Next Level\" to continue!");
1193 return _(
"Wicked! Press \"Next Level\" to continue!");
1197 return _(
"Press the spacebar to change your currently selected tile");
1200 return _(
"Push the boulders onto the targets");
1206void bd_make_move(
entity minigame,
string dir)
1214void bd_editor_make_move(
entity minigame,
string dir)
1222void bd_editor_fill(
entity minigame)
1230void bd_set_curr_pos(
string s)
1238bool bd_change_dozer_angle(
entity minigame)
1244 switch(dozer.bd_dir)
1254 bd_editor_make_move(minigame, thedir);
1259int bd_client_event(
entity minigame,
string event, ...)
1265 strcpy(minigame.message, bd_turn_to_string(minigame.minigame_flags));
1266 bd_set_curr_pos(
"");
1276 case "key_released":
1278 bool event_blocked = ((
event ==
"key_released")
1282 switch ( ...(0,
int) )
1288 bd_make_move(minigame,
"r");
1294 bd_make_move(minigame,
"l");
1300 bd_make_move(minigame,
"u");
1306 bd_make_move(minigame,
"d");
1313 switch ( ...(0,
int) )
1319 if ( ! bd_curr_pos )
1320 bd_set_curr_pos(
"a3");
1328 if ( ! bd_curr_pos )
1329 bd_set_curr_pos(
"c3");
1337 if ( ! bd_curr_pos )
1338 bd_set_curr_pos(
"a1");
1346 if ( ! bd_curr_pos )
1347 bd_set_curr_pos(
"a3");
1355 bd_editor_make_move(minigame,
"");
1360 if(bd_change_dozer_angle(minigame))
1371 case "mouse_pressed":
1377 bd_client_event(minigame,
"mouse_moved");
1378 bd_editor_make_move(minigame,
"");
1384 bd_client_event(minigame,
"mouse_moved");
1385 bd_editor_fill(minigame);
1399 bd_set_curr_pos(
"");
1403 case "network_receive":
1406 int sf = ...(1,
int);
1407 if ( sent.classname ==
"minigame" )
1411 strcpy(sent.message, bd_turn_to_string(sent.minigame_flags));
1416 else if(sent.classname ==
"minigame_board_piece")
1430 sent.bd_moves = ReadShort();
1444 if(...(0,
string) ==
"next")
1446 if(...(0,
string) ==
"restart")
1448 if(...(0,
string) ==
"edit")
1450 if(...(0,
string) ==
"save")
const int BD_SF_UPDATE_ALL
void bd_unfill_recurse(entity minigame, entity player, int thetype, int letter, int number)
void bd_restart_match(entity minigame, entity player)
entity bd_find_controller(entity minig, int letter)
int bd_fix_dir(vector dir)
void bd_next_match(entity minigame, entity player, string next)
int bd_server_event(entity minigame, string event,...)
void bd_do_next_match(entity minigame, entity player)
void bd_setup_pieces(entity minigame)
void bd_close_editor(entity minigame, entity player)
void bd_set_next_match(entity minigame, string next)
void bd_activate_editor(entity minigame, entity player)
void bd_move(entity minigame, entity player, string dir)
vector bd_get_dir(int bdir)
void bd_controller_update(entity controller, int number)
void bd_reset_moves(entity minigame)
bool bd_canfill(int ttype)
bool bd_save_level(entity minigame)
string autocvar_sv_minigames_bulldozer_startlevel
const int BD_SF_PLAYERMOVES
void bd_load_piece(entity minigame, string s)
entity bd_find_dozer(entity minig)
const int BD_SF_UPDATE_SINGLE
string bd_save_controller_piece(entity minigame, entity e, int number)
bool bd_move_dozer(entity minigame, entity dozer)
int bd_tiletypes[BD_NUM_CNT]
const int BD_TILE_BOULDER
const int BD_SPECTATOR_TEAM
void bd_do_fill(entity minigame, entity player, string dir, string thetile)
int bd_dir_fromname(string bdir)
string bd_get_dir_name(int bdir)
void bd_set_nextlevel(entity minigame, string s)
void bd_check_winner(entity minig)
void bd_editor_place(entity minigame, entity player, string pos, int thetile, string thedir)
bool bd_controller_send(entity this, entity to, int sf)
entity bd_find_piece(entity minig, string tile, bool check_target)
void bd_load_level(entity minigame)
string bd_save_piece(entity minigame, entity e)
void bd_fill_recurse(entity minigame, entity player, int thetype, int letter, int number)
void bd_do_move(entity minigame, entity player, string dir, string thetile, string thedir)
bool bd_valid_tile(string tile)
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
void minigame_drawcolorcodedstring_trunc(float maxwidth, vector pos, string text, vector fontsize, float theAlpha, int drawflags)
void minigame_show_allspecs(vector boardpos, vector boardsize)
vector minigame_drawstring_wrapped(float maxwidth, vector pos, string text, vector fontsize, vector color, float theAlpha, int drawflags, float align)
void minigame_hud_simpleboard(vector pos, vector mySize, string board_texture)
string minigame_texture(string name)
vector minigame_hud_denormalize_size(vector v, vector pos, vector mySize)
vector minigame_drawcolorcodedstring_wrapped(float maxwidth, vector pos, string text, vector fontsize, float theAlpha, int drawflags, float align)
vector minigame_hud_denormalize(vector v, vector pos, vector mySize)
vector minigame_hud_normalize(vector v, vector pos, vector mySize)
void minigame_read_owner(entity this)
void minigame_drawpic_centered(vector pos, string texture, vector sz, vector color, float thealpha, int drawflags)
#define REGISTER_MINIGAME(name, nicename)
#define minigame_hud_fitsqare(pos, mySize)
#define minigame_cmd(...)
#define FOREACH_MINIGAME_ENTITY(entityvar)
void HUD_MinigameMenu_CustomEntry(entity parent, string menumessage, string event_arg)
#define drawstring(position, text, scale, rgb, alpha, flag)
#define drawpic(position, pic, size, rgb, alpha, flag)
#define drawfill(position, size, rgb, alpha, flag)
string strtolower(string s)
const float DRAWFLAG_NORMAL
const float DRAWFLAG_ADDITIVE
string entcs_GetName(int i)
ERASEABLE bool fexists(string f)
#define HUD_Panel_DrawBg()
#define NET_HANDLE(id, param)
#define WriteHeader(to, id)
#define REGISTER_NET_LINKED(id)
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
entity msle_spawn(entity minigame_session, entity e)
string minigame_relative_tile(string start_id, int dx, int dy, int rows, int columns)
void minigame_server_sendflags(entity ent, int mgflags)
int minigame_count_players(entity minigame)
int minigame_tile_letter(string id)
string minigame_tile_name(vector pos, int rows, int columns)
vector minigame_tile_pos(string id, int rows, int columns)
string minigame_tile_buildname(int letter, int number)
int minigame_tile_number(string id)
const int MINIG_SF_UPDATE
const int MINIG_SF_CUSTOM
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define new_pure(class)
purely logical entities (not linked to the area grid)
void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)