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 )
150NET_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.minigame_id = minigame.minigame_id;
585 controller.descriptor = minigame.descriptor;
586 controller.bd_tilelet = letter;
600 if(minigame.bd_nextlevel && minigame.bd_nextlevel !=
"")
602 strcpy(minigame.bd_levelname, minigame.bd_nextlevel);
637 if(!player.minigame_players.bd_canedit)
639 sprint(player.minigame_players,
"You're not allowed to edit levels, sorry!\n");
654 string bd_string =
"";
658 bd_string =
strcat(bd_string,
"\"", tilename,
"\" ");
667 string bd_string =
"";
669 bd_string =
strcat(bd_string,
"\"", e.netname,
"\" ");
670 bd_string =
strcat(bd_string,
ftos(e.bd_tiletype),
" ");
671 bd_string =
strcat(bd_string,
ftos(e.bd_dir));
696 string bd_string = s;
701 string tilename =
strzone(
argv(argv_num)); ++argv_num;
702 int tiletype =
stoi(
argv(argv_num)); ++argv_num;
710 controller.bd_tiletypes[
number] = tiletype;
718 e.netname = tilename;
721 e.bd_tiletype = tiletype;
728 if(minigame.bd_levelname && minigame.bd_levelname !=
"")
730 int target_count = 0, boulder_count = 0;
733 if(piece.classname ==
"minigame_board_piece")
741 if(boulder_count != target_count)
743 LOG_INFO(
"Not enough targets or boulders, fix your level!");
751 file_name =
strcat(
"minigames/bulldozer/storage_", minigame.bd_levelname,
".txt");
753 fputs(file_get,
strcat(
"// bulldozer storage \"", minigame.bd_levelname,
"\" last updated ", strftime(
true,
"%d-%m-%Y %H:%M:%S"),
"\n"));
755 if(minigame.bd_nextlevel && minigame.bd_nextlevel !=
"" &&
fexists(
strcat(
"minigames/bulldozer/storage_", minigame.bd_nextlevel,
".txt")))
756 fputs(file_get,
strcat(
"nextlevel = \"", minigame.bd_nextlevel,
"\"\n"));
760 if ( e.classname ==
"bd_controller" )
771 if ( e.classname ==
"minigame_board_piece" )
787 string file_read, file_name;
790 file_name =
strcat(
"minigames/bulldozer/storage_", minigame.bd_levelname,
".txt");
794 LOG_INFO(
"^3BULLDOZER: ^7could not find storage file ^3", file_name,
"^7, no items were loaded");
800 file_read =
fgets(file_get);
807 if(
substring(file_read, 0, 9) ==
"nextlevel")
822 if(!player.minigame_players.bd_canedit)
824 sprint(player.minigame_players,
"You're not allowed to edit levels, sorry!\n");
832 LOG_INFO(
"You need to place a bulldozer on the level to save it!");
843 LOG_INFO(
"You need to set the level name!");
867 if(e.classname ==
"minigame_board_piece")
874 if(e.classname ==
"bd_controller")
879 strfree(minigame.bd_nextlevel);
880 strfree(minigame.bd_levelname);
935 if ( sent.classname ==
"minigame_board_piece" && (sf &
MINIG_SF_UPDATE) )
968string bd_get_tile_pic(
int tileid)
993 bd_boardsize = mySize;
1003 if(e.classname ==
"minigame_board_piece")
1019 if ( e.classname ==
"bd_controller" )
1023 if(!e.bd_tiletypes[j])
continue;
1025 int letter = e.bd_tilelet;
1031 string thepiece = bd_get_tile_pic(e.bd_tiletypes[j]);
1038 else if ( e.classname ==
"minigame_board_piece" )
1045 string thepiece = bd_get_tile_pic(e.bd_tiletype);
1048 thepiece =
"bd/boulder_target";
1060 if ( e.classname ==
"minigame_board_piece" && e.bd_tiletype ==
BD_TILE_DOZER )
1065 int bdir = e.bd_dir;
1078 tile_size, tile_size/2,
'1 1 1',
1088 string thepiece = ((piece || (targ && bd_curr_tile !=
BD_TILE_BOULDER)) ?
"bd/delete" : bd_get_tile_pic(bd_curr_tile));
1095 tile_size, tile_size/2,
'1 1 1',
1109 string victory_text = _(
"Game over!");
1112 victory_text = _(
"Well done! Click \"Next Level\" to continue");
1114 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_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
WriteByte(chan, ent.angles.y/DEC_FACTOR)
string entcs_GetName(int i)
ERASEABLE bool fexists(string f)
#define HUD_Panel_DrawBg()
#define NET_HANDLE(id, param)
#define ReadRegistered(r)
#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)
#define WriteRegistered(r, to, it)
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)
int minigame_id
Unique ID for the minigame session, associated with all objects currently the result of etof(minigame...
const int MINIG_SF_UPDATE
const int MINIG_SF_CUSTOM
entity descriptor
For minigame sessions: minigame descriptor object.
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)