Bomberman part 1

This commit is contained in:
DeityLink
2015-04-09 00:09:36 +02:00
parent 0942fdd0bb
commit 4a30eecfaf
21 changed files with 1079 additions and 2 deletions

View File

@@ -908,6 +908,7 @@
#include "code\modules\awaymissions\maploader\reader.dm"
#include "code\modules\awaymissions\maploader\swapmaps.dm"
#include "code\modules\awaymissions\maploader\writer.dm"
#include "code\modules\bomberman\bomberman.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"

View File

@@ -557,4 +557,20 @@
//Return a lattice to allow plating building, return 0 for error message, return -1 for silent fail.
/turf/proc/canBuildPlating()
return BUILD_SILENT_FAILURE
return BUILD_SILENT_FAILURE
/////////////////////////////////////////////////////
/turf/proc/spawn_powerup()
spawn(5)
var/powerup = pick(
50;/obj/structure/powerup/bombup,
50;/obj/structure/powerup/fire,
50;/obj/structure/powerup/skate,
10;/obj/structure/powerup/kick,
10;/obj/structure/powerup/line,
10;/obj/structure/powerup/power,
10;/obj/structure/powerup/skull,
5;/obj/structure/powerup/full,
)
new powerup(src)

View File

@@ -34,6 +34,7 @@ var/list/directional = list(
/obj/machinery/light,
/obj/machinery/door/airlock/multi_tile,
/obj/machinery/camera,
/obj/structure/bomberflame,
)
var/list/exception = list(

View File

@@ -742,6 +742,11 @@ var/global/floorIsLava = 0
<A href='?src=\ref[src];secretsfun=togglenarsie'>Toggle Nar-Sie's behaviour</A><BR>
<A href='?src=\ref[src];secretsfun=fakealerts'>Trigger a fake alert</A><BR>
<A href='?src=\ref[src];secretsfun=fakebooms'>Adds in some Micheal Bay to the shift without major destruction</A><BR>
<A href='?src=\ref[src];secretsfun=massbomber'>Turn every players into Bomberman</A><BR>
<A href='?src=\ref[src];secretsfun=bomberhurt'>Make Bomberman Bombs actually hurt players</A><BR>
<A href='?src=\ref[src];secretsfun=bomberdestroy'>Make Bomberman Bombs actually destroy stuff</A><BR>
<A href='?src=\ref[src];secretsfun=bombernohurt'>Make Bomberman Bombs harmless to players(default)</A><BR>
<A href='?src=\ref[src];secretsfun=bombernodestroy'>Make Bomberman Bombs harmless to the environnement(default)</A><BR>
<BR>
<B>Final Solutions</B><BR>
<I>(Warning, these will end the round!)</I><BR>

View File

@@ -108,6 +108,8 @@ var/list/admin_verbs_fun = list(
/client/proc/editappear,
/client/proc/commandname,
/client/proc/delete_all_adminbus,
/client/proc/delete_all_bomberman,
/client/proc/create_bomberman_arena,
/client/proc/gib_money, // /vg/
/client/proc/smissmas,
)

View File

@@ -2761,6 +2761,69 @@
for(var/i = 1 to choice)
world << sound('sound/effects/explosionfar.ogg')
sleep(rand(2, 10)) //Sleep 0.2 to 1 second
if("massbomber")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BBM")
var/choice = alert("Dress every player like Bomberman and give them BBDs?","Bomberman Mode Activation","Confirm","Cancel")
if(choice=="Confirm")
world << sound('sound/bomberman/start.ogg')
for(var/mob/living/carbon/human/M in player_list)
if(M.wear_suit)
var/obj/item/O = M.wear_suit
M.u_equip(O)
O.loc = M.loc
O.dropped(M)
if(M.head)
var/obj/item/O = M.head
M.u_equip(O)
O.loc = M.loc
O.dropped(M)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/bomberman(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/bomberman(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/bomberman/(M), slot_s_store)
M.update_icons()
M << "Wait...what?"
spawn(50)
M << "<span class='notice'>Tip: Use the BBD in your suit's pocket to place bombs.</span>"
message_admins("[key_name_admin(usr)] turned everyone into Bomberman!")
log_admin("[key_name_admin(usr)] turned everyone into Bomberman!")
if("bomberhurt")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BBH")
var/choice = alert("Activate Cuban Pete mode? Note that newly spawned BBD will still have player damage deactivated.","Activating Bomberman Bombs Player Damage","Confirm","Cancel")
if(choice=="Confirm")
for(var/obj/item/weapon/bomberman/B in world)
B.hurt_players = 1
message_admins("[key_name_admin(usr)] enabled the player damage of the Bomberman Bomb Dispensers currently in the world. Cuban Pete approves.")
log_admin("[key_name_admin(usr)] enabled the player damage of the Bomberman Bomb Dispensers currently in the world. Cuban Pete approves.")
if("bomberdestroy")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BBD")
var/choice = alert("Activate Michael Bay mode? Note that newly spawned BBD will still have environnement damage deactivated.","Activating Bomberman Bombs Environnement Damage","Confirm","Cancel")
if(choice=="Confirm")
for(var/obj/item/weapon/bomberman/B in world)
B.destroy_environnement = 1
message_admins("[key_name_admin(usr)] enabled the environnement damage of the Bomberman Bomb Dispensers currently in the world. Michael Bay approves.")
log_admin("[key_name_admin(usr)] enabled the environnement damage of the Bomberman Bomb Dispensers currently in the world. Michael Bay approves.")
if("bombernohurt")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BBNH")
var/choice = alert("Disable Cuban Pete mode.","Disable Bomberman Bombs Player Damage","Confirm","Cancel")
if(choice=="Confirm")
for(var/obj/item/weapon/bomberman/B in world)
B.hurt_players = 0
message_admins("[key_name_admin(usr)] disabled the player damage of the Bomberman Bomb Dispensers currently in the world.")
log_admin("[key_name_admin(usr)] disabled the player damage of the Bomberman Bomb Dispensers currently in the world.")
if("bombernodestroy")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BBND")
var/choice = alert("Disable Michael Bay mode?","Disable Bomberman Bombs Environnement Damage","Confirm","Cancel")
if(choice=="Confirm")
for(var/obj/item/weapon/bomberman/B in world)
B.destroy_environnement = 0
message_admins("[key_name_admin(usr)] disabled the environnement damage of the Bomberman Bomb Dispensers currently in the world.")
log_admin("[key_name_admin(usr)] disabled the environnement damage of the Bomberman Bomb Dispensers currently in the world.")
if(usr)
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
if(ok)

View File

@@ -564,7 +564,9 @@ Pressure: [env.return_pressure()]"}
"emergency rescue team",
"nanotrasen representative",
"nanotrasen officer",
"nanotrasen captain"
"nanotrasen captain",
"Bomberman",
"Bomberman(arena)",
)
var/dostrip = input("Do you want to strip [M] before equipping them? (0=no, 1=yes)", "STRIPTEASE") as null|anything in list(0,1)
if(isnull(dostrip))
@@ -952,6 +954,37 @@ Pressure: [env.return_pressure()]"}
W.assignment = "Admiral"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
if("Bomberman")
M.equip_to_slot_or_del(new /obj/item/clothing/under/darkblue(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/purple(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/bomberman(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/bomberman(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/bomberman/(M), slot_s_store)
if("Bomberman(arena)") //they have a random color, cannot remove their clothes, and their initial speed is slightly lowered by their suit.
M.equip_to_slot_or_del(new /obj/item/clothing/under/darkblue(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/purple(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/bomberman(M), slot_head)
var/obj/item/clothing/suit/space/bomberman/bombsuit = new /obj/item/clothing/suit/space/bomberman(M)
M.equip_to_slot_or_del(bombsuit, slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/bomberman/(M), slot_s_store)
bombsuit.slowdown = 1
var/list/randomhexes = list(
"7",
"8",
"9",
"a",
"b",
"c",
"d",
"e",
"f",
)
M.color = "#[pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)]"
for(var/obj/item/clothing/C in M)
C.canremove = 0
M.name = "Bomberman #[rand(1,999)]"
M.regenerate_icons()
@@ -1318,6 +1351,68 @@ client/proc/delete_all_adminbus()
for(var/obj/structure/stool/bed/chair/vehicle/adminbus/AB in world)
AB.Adminbus_Deletion()
client/proc/delete_all_bomberman()
set name = "Remove all that Bomberman shit"
set desc = "4th wall ointment."
set category = "Fun"
if(alert(usr, "Remove all Bomberman-related objects in the game world?", "Remove Bomberman", "Yes", "No") != "Yes")
return
for(var/obj/structure/bomberflame/O in world)
qdel(O)
for(var/obj/structure/bomberman/O in world)
qdel(O)
for(var/obj/item/weapon/bomberman/O in world)
if(istype(O.loc, /mob/living/carbon/))
var/mob/living/carbon/C = O.loc
C.u_equip(O)
O.loc = C.loc
O.dropped(C)
qdel(O)
for(var/obj/item/clothing/suit/space/bomberman/O in world)
if(istype(O.loc, /mob/living/carbon/))
var/mob/living/carbon/C = O.loc
C.u_equip(O)
O.loc = C.loc
O.dropped(C)
qdel(O)
for(var/obj/item/clothing/head/helmet/space/bomberman/O in world)
if(istype(O.loc, /mob/living/carbon/))
var/mob/living/carbon/C = O.loc
C.u_equip(O)
O.loc = C.loc
O.dropped(C)
qdel(O)
for(var/obj/structure/softwall/O in world)
qdel(O)
for(var/turf/unsimulated/wall/bomberman/T in world)
T.ChangeTurf(/turf/simulated/wall)
for(var/obj/structure/powerup/O in world)
qdel(O)
client/proc/create_bomberman_arena()
set name = "Create a Bomberman Arena"
set desc = "4th wall ointment."
set category = "Fun"
var/list/arena_sizes = list(
"screensized",
"saturntenplayers",
)
var/arena_type = input("What size for the arena?", "Arena Construction") in arena_sizes
var/turf/T = get_turf(src.mob)
var/datum/bomberman_arena/A = new /datum/bomberman_arena(T,arena_type,src.mob)
arenas += A
client/proc/mob_list()
set name = "show mob list"
set category = "Debug"

View File

@@ -0,0 +1,883 @@
//////////////////////////////////based on the original game by Hudson Soft
//Spess Bomberman, by Deity Link//
//////////////////////////////////
#define MAX_BOMB_POWER 16 //How far will the largest explosions reach.
#define MAX_SPEED_BONUS 10 //How fast can a player get by cumulating skates (his tally cannot exceed -1 anyway, but additional skates will allow him to stay fast while starving for example)
///////////////////////////////BOMB DISPENSER//////////////////////////
/obj/item/weapon/bomberman/
name = "Bomberman's Bomb Dispenser"
desc = "Now to not get yourself stuck in a corner."
w_class = 5.0
icon = 'icons/obj/bomberman.dmi'
icon_state = "dispenser"
var/bomblimit = 1 //how many bombs are currently in the dispenser
var/bombtotal = 1 //how many bombs can this dispenser sustain in the world at once
var/bombpower = 1 //how many tiles do the fire columns reach
var/can_kick = 0 //allows its holder to kick bombs. kicked bombs roll until their reach an obstacle or detonate
var/can_line = 0 //allows its user to deploy all his bombs in a line at once
var/has_power = 0 //if this dispenser currently has no bombs in the world, its next bomb will have maximum power
var/skate = 0
var/speed_bonus = 0 //each skate power-up will speed-up its user. whoever holds the dispenser has the bonus.
//griff modifiers, can be changed globaly with admin commands
var/destroy_environnement = 0 //does it break wall/tables/closets
var/hurt_players = 0 //damage dealt by the bombs to mobs
//disease modifiers
var/slow = 0
var/fast = 0
var/small_bomb = 0
var/no_bomb = 0
var/spam_bomb = 0
/obj/item/weapon/bomberman/attack_self(mob/user)
var/turf/T = get_turf(src)
if(bomblimit && !no_bomb)
var/power = bombpower
if(small_bomb)
power = 1
if(!(locate(/obj/structure/bomberman) in T))
playsound(T, 'sound/bomberman/bombplace.ogg', 50, 1)
if(has_power && (bomblimit == bombtotal))
bomblimit--
new /obj/structure/bomberman/power(T, power, destroy_environnement, hurt_players, src)
else
bomblimit--
new /obj/structure/bomberman(T, power, destroy_environnement, hurt_players, src)
else if(can_line)
playsound(T, 'sound/bomberman/bombplace.ogg', 50, 1)
bomblimit--
new /obj/structure/bomberman(T, power, destroy_environnement, hurt_players, src, user.dir)
/obj/item/weapon/bomberman/proc/cure(var/disease)
world << "making a cure() for [disease]"
spawn(400)
world << "curing [disease]"
switch(disease)
if("Low Power Disease")
small_bomb = 0
if("Constipation")
no_bomb = 0
if("Diarrhea")
spam_bomb = 0
if("Slow Pace Disease")
slow = 0
if("Rapid Pace Disease")
fast = 0
speed_bonus = skate
/obj/item/weapon/bomberman/proc/lost()
var/list/turfs = list()
for(var/turf/T in range(loc,1))
turfs += T
while(skate > 0)
new/obj/structure/powerup/skate(pick(turfs))
skate--
while(bombtotal > 1)
new/obj/structure/powerup/bombup(pick(turfs))
bombtotal--
while(bombpower > 1)
new/obj/structure/powerup/fire(pick(turfs))
bombpower--
if(can_kick)
new/obj/structure/powerup/kick(pick(turfs))
if(can_line)
new/obj/structure/powerup/line(pick(turfs))
if(has_power)
new/obj/structure/powerup/power(pick(turfs))
qdel(src)
///////////////////////////////BOMB////////////////////////////////////
/obj/structure/bomberman
name = "bomb"
desc = "Tick, Tick, Tick!"
icon = 'icons/obj/bomberman.dmi'
icon_state = "bomb"
density = 1
anchored = 1
var/bombpower = 1
var/destroy_environnement = 0
var/hurt_players = 0
var/obj/item/weapon/bomberman/parent = null
var/countdown = 3
var/kicked = 0
/obj/structure/bomberman/power/
icon_state = "bomb_power"
/obj/structure/bomberman/New(turf/loc, var/Bpower=1, var/destroy=0, var/hurt=0, var/dispenser=null, var/line_dir=null)
..()
bombpower = Bpower
destroy_environnement = destroy
hurt_players = hurt
parent = dispenser
if(line_dir)
var/turf/T1 = get_turf(src)
step(src,line_dir)
var/turf/T2 = get_turf(src)
if(T1 == T2)
qdel(src)
else if(parent.bomblimit > 0)
parent.bomblimit--
new /obj/structure/bomberman(T2, bombpower, destroy_environnement, hurt_players, parent, line_dir)
ticking()
/obj/structure/bomberman/Bump(atom/obstacle)
kicked = 0
..()
/obj/structure/bomberman/Bumped(M as mob|obj) //kick bomb
for (var/obj/item/weapon/bomberman/dispenser in M)
if (dispenser.can_kick && !kicked)
kicked = 1
kicked(get_dir(M,src))
..()
/obj/structure/bomberman/proc/ticking()
countdown--
sleep(10)
if(countdown <= 0)
detonate()
else
ticking()
/obj/structure/bomberman/proc/detonate()
var/turf/T = get_turf(src)
playsound(T, 'sound/bomberman/bombexplode.ogg', 100, 1)
spawn()
new /obj/structure/bomberflame(T,1,bombpower,SOUTH,destroy_environnement,hurt_players)
qdel(src)
/obj/structure/bomberman/power/detonate()
var/turf/T = get_turf(src)
playsound(T, 'sound/bomberman/bombexplode.ogg', 100, 1)
spawn()
new /obj/structure/bomberflame(T,1,MAX_BOMB_POWER,SOUTH,destroy_environnement,hurt_players)
qdel(src)
/obj/structure/bomberman/proc/kicked(var/kick_dir)
var/turf/T1 = get_turf(src)
step(src, kick_dir)
var/turf/T2 = get_turf(src)
if(locate(/obj/structure/bomberflame) in T2) //if a kicked bomb rolls into an explosion, it detonates
detonate()
if(T1 != T2)
sleep(2)
kicked(kick_dir)
else
kicked = 0
/obj/structure/bomberman/Destroy()
if(parent)
parent.bomblimit++
..()
/obj/structure/bomberman/emp_act(severity) //EMPs can safely remove the bombs
qdel(src)
return
/obj/structure/bomberman/bullet_act(var/obj/item/projectile/Proj)
visible_message("<span class='warning'>\The [Proj] hits \the [src].</span>")
detonate()
return
/obj/structure/bomberman/ex_act(severity)
detonate()
return
/obj/structure/bomberman/cultify()
return
/obj/structure/bomberman/singuloCanEat()
return 0
///////////////////////////////FLAME/EXPLOSION//////////////////////////
/obj/structure/bomberflame
name = "explosion"
desc = "Sidesteps are its only weakness."
icon = 'icons/obj/bomberman.dmi'
icon_state = "explosion_core"
density = 0
anchored = 1
layer = LIGHTING_LAYER+1
var/destroy_environnement = 0
var/hurt_players = 0
var/fuel = 1
/obj/structure/bomberflame/New(turf/loc, var/initial=1, var/power=1, var/flame_dir=SOUTH, var/destroy=0, var/hurt=0)
..()
fuel = power
dir = flame_dir
destroy_environnement = destroy
hurt_players = hurt
var/turf/T1 = get_turf(src)
var/turf/T2 = null
if(!initial)
if(fuel)
icon_state = "explosion_branch"
else
icon_state = "explosion_tip"
step(src, flame_dir)
T2 = get_turf(src)
if(T1 == T2)
del(src)
return
else
T2 = T1
collisions(T2)
spawn(1)
if(fuel)
propagate(initial)
sleep(5)
collisions(T2)
sleep(5)
qdel(src)
/obj/structure/bomberflame/proc/collisions(var/turf/T)
for(var/mob/living/carbon/C in T)
for(var/obj/item/weapon/bomberman/dispenser in C.contents)
C.u_equip(dispenser)
dispenser.loc = C.loc
dispenser.dropped(C)
dispenser.lost()
T.turf_animation('icons/obj/bomberman.dmi',"dispenser_break",0,0,MOB_LAYER-0.1,'sound/bomberman/bombed.ogg')
if(hurt_players)
for(var/mob/living/L in T)
if(fuel <= 2)
L.ex_act(3)
else if(fuel <= 10)
L.ex_act(2)
else
L.ex_act(1)
/obj/structure/bomberflame/proc/propagate(var/init)
if(init)
for(var/direction in cardinal)
spawn() //so we don't wait for the flame to die before it spawns the next one, duh
new /obj/structure/bomberflame(get_turf(src),0,fuel-1,direction,destroy_environnement,hurt_players)
else
new /obj/structure/bomberflame(get_turf(src),0,fuel-1,dir,destroy_environnement,hurt_players)
/obj/structure/bomberflame/Bump(atom/obstacle) //if an explosion reaches a bomb, it detonates
if(istype(obstacle, /obj/structure/bomberman/))
var/obj/structure/bomberman/chained_explosion = obstacle
chained_explosion.detonate()
else if(istype(obstacle, /obj/structure/softwall/))
var/obj/structure/softwall/wall_break = obstacle
wall_break.pulverized()
if(destroy_environnement)
if(istype(obstacle, /obj/structure/closet/))
qdel(obstacle)
else if(istype(obstacle, /obj/structure/table/))
var/obj/structure/table/table = obstacle
table.destroy()
else if(istype(obstacle, /obj/structure/rack/))
var/obj/structure/rack/rack = obstacle
rack.destroy()
else if(istype(obstacle, /obj/structure/grille))
var/obj/structure/grille/grille = obstacle
grille.broken = 1
grille.icon_state = "[initial(grille.icon_state)]-b"
grille.density = 0
if(prob(35))
var/turf/T = grille.loc
T.spawn_powerup()
else if(istype(obstacle, /obj/structure/window))
qdel(obstacle)
else if(istype(obstacle, /turf/simulated/wall/) && !istype(obstacle, /turf/simulated/wall/r_wall))
var/turf/T = obstacle
T.ChangeTurf(/turf/simulated/floor/plating)
T.icon_state = "wall_thermite"
if(prob(35))
T.spawn_powerup()
else if(istype(obstacle, /obj/structure/reagent_dispensers/fueltank))
obstacle.ex_act(1)
else if(istype(obstacle, /obj/machinery/portable_atmospherics/canister))
var/obj/machinery/portable_atmospherics/canister/canister = obstacle
canister.health = 0
canister.healthcheck()
else if(istype(obstacle, /obj/machinery/computer/))
var/obj/machinery/computer/computer = obstacle
for(var/x in computer.verbs)
computer.verbs -= x
computer.set_broken()
..()
/obj/structure/bomberflame/ex_act(severity)
return
/obj/structure/bomberflame/cultify()
return
/obj/structure/bomberflame/singuloCanEat()
return 0
///////////////////////////////SOFT WALLS/////////////////////////////
/obj/structure/softwall
name = "soft wall"
desc = "Looks like even the weakest explosion could break this wall apart."
icon = 'icons/obj/bomberman.dmi'
icon_state = "softwall"
density = 1
anchored = 1
/obj/structure/softwall/proc/pulverized()
icon_state = "softwall_break"
density = 0
mouse_opacity = 0
spawn(5)
if(prob(35))
pick_a_powerup()
spawn(5)
qdel(src)
/obj/structure/softwall/proc/pick_a_powerup()
var/powerup = pick(
50;/obj/structure/powerup/bombup,
50;/obj/structure/powerup/fire,
50;/obj/structure/powerup/skate,
10;/obj/structure/powerup/kick,
10;/obj/structure/powerup/line,
10;/obj/structure/powerup/power,
10;/obj/structure/powerup/skull,
5;/obj/structure/powerup/full,
)
new powerup(get_turf(src))
/obj/structure/softwall/ex_act(severity)
pulverized()
return
/obj/structure/softwall/cultify()
return
/obj/structure/softwall/singuloCanEat()
return 0
///////////////////////////////HARD WALLS/////////////////////////////
/turf/unsimulated/wall/bomberman
name = "hard wall"
icon = 'icons/obj/bomberman.dmi'
icon_state = "hardwall"
opacity = 0
/turf/unsimulated/wall/ex_act(severity)
return
/turf/unsimulated/wall/cultify()
return
/turf/unsimulated/wall/singuloCanEat()
return 0
///////////////////////////////POWER-UPS//////////////////////////////
/obj/structure/powerup
name = "powerup"
desc = ""
icon = 'icons/obj/bomberman.dmi'
icon_state = "powerup"
density = 1
anchored = 1
/obj/structure/powerup/bombup
name = "bomb-up"
icon_state = "bombup"
/obj/structure/powerup/fire
name = "fire"
icon_state = "fire"
/obj/structure/powerup/full
name = "full fire"
icon_state = "full"
/obj/structure/powerup/kick
name = "kick"
icon_state = "kick"
/obj/structure/powerup/line
name = "line bomb"
icon_state = "line"
/obj/structure/powerup/power
name = "power bomb"
icon_state = "power"
/obj/structure/powerup/skate
name = "skate"
icon_state = "skate"
/obj/structure/powerup/skull
name = "skull"
icon_state = "skull"
/obj/structure/powerup/attackby(var/obj/item/weapon/bomberman/dispenser, var/mob/user)
if(istype(dispenser))
apply_power(dispenser)
..()
/obj/structure/powerup/Bumped(M as mob|obj) //kick bomb
if (istype(M, /mob/living) || istype(M, /obj/mecha) || istype(M, /obj/structure/stool/bed/chair/) || istype(M, /obj/structure/bomberflame))
density = 0
step(M, get_dir(M,src))
spawn(1) //to prevent an infinite loop when a player with no BBD is trying to walk over a tile with at least two power-ups.
density = 1
var/obj/item/weapon/bomberman/dispenser = locate() in M
if (dispenser)
apply_power(dispenser)
if (istype(M, /obj/structure/bomberflame))
icon_state = "powerup_break"
spawn(5)
qdel(src)
..()
/obj/structure/powerup/proc/apply_power(var/obj/item/weapon/bomberman/dispenser)
playsound(get_turf(src), 'sound/bomberman/powerup.ogg', 50, 1)
qdel(src)
return
/obj/structure/powerup/bombup/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.bomblimit++
dispenser.bombtotal++
..()
return
/obj/structure/powerup/fire/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.bombpower = min(MAX_BOMB_POWER, dispenser.bombpower + 1)
..()
return
/obj/structure/powerup/full/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.bombpower = MAX_BOMB_POWER
..()
return
/obj/structure/powerup/kick/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.can_kick = 1
..()
return
/obj/structure/powerup/line/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.can_line = 1
..()
return
/obj/structure/powerup/power/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.has_power = 1
..()
return
/obj/structure/powerup/skate/apply_power(var/obj/item/weapon/bomberman/dispenser)
dispenser.skate = min(MAX_SPEED_BONUS, dispenser.skate + 1)
if(!dispenser.slow)
dispenser.speed_bonus = min(MAX_SPEED_BONUS, dispenser.speed_bonus + 1)
..()
return
/obj/structure/powerup/skull/apply_power(var/obj/item/weapon/bomberman/dispenser)
playsound(get_turf(src), 'sound/bomberman/disease.ogg', 50, 1)
var/list/diseases = list(
"Low Power Disease",
"Constipation ",
"Diarrhea",
"Slow Pace Disease",
"Rapid Pace Disease",
"Change",
"Fire",
)
var/disease = pick(diseases)
dispenser.loc << "<span class='danger'>[disease][((disease != "Fire")&&(disease != "Change")) ? " for 40 seconds" : ""]!!</span>"
switch(disease)
if("Low Power Disease")
dispenser.small_bomb = 1
dispenser.cure(disease)
if("Constipation")
dispenser.no_bomb = 1
dispenser.cure(disease)
if("Diarrhea")
dispenser.spam_bomb = 1
dispenser.cure(disease)
if("Slow Pace Disease")
dispenser.slow = 1
dispenser.cure(disease)
if("Rapid Pace Disease")
dispenser.fast = 1
dispenser.speed_bonus = MAX_SPEED_BONUS
dispenser.cure(disease)
if("Change")
for(var/mob/living/carbon/C in player_list)
var/obj/item/weapon/bomberman/target = locate() in C
if(target)
var/turf/T = get_turf(src)
var/mob/living/L = src.loc
L.loc = C.loc
C.loc = T
playsound(get_turf(src), 'sound/bomberman/disease.ogg', 50, 1)
qdel(src)
return
if("Fire")
if(istype(dispenser.loc, /mob/living/carbon))
var/mob/living/carbon/M = dispenser.loc
M.adjust_fire_stacks(0.5)
M.on_fire = 1
M.update_icon = 1
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
qdel(src)
return
/obj/structure/powerup/proc/pulverized()
qdel(src)
/obj/structure/powerup/ex_act(severity)
pulverized()
return
/obj/structure/powerup/cultify()
return
/obj/structure/powerup/singuloCanEat()
return 0
///////////////////////////////CLOTHING///////////////////////////////
/obj/item/clothing/suit/space/bomberman
name = "Bomberman's suit"
desc = "Doesn't actually make you immune to bombs!"
icon_state = "bomberman"
item_state = "bomberman"
slowdown = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
siemens_coefficient = 0
flags = FPRINT | ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEJUMPSUIT
heat_protection = UPPER_TORSO|LOWER_TORSO
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
allowed = list(/obj/item/weapon/bomberman/)
pressure_resistance = 40 * ONE_ATMOSPHERE
/obj/item/clothing/head/helmet/space/bomberman
name = "Bomberman head"
desc = "Terrorism has never looked so adorable."
icon_state = "bomberman"
item_state = "bomberman"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR
body_parts_covered = FULL_HEAD
siemens_coefficient = 0
///////////////////////////////ARENA BUILDER///////////////////////////
var/global/list/arenas = list()
/datum/bomberman_spawn
var/turf/spawnpoint = null
var/availability = 0
/datum/bomberman_arena
var/name = "Bomberman Arena"
var/area/arena = null
var/area/under = null
var/turf/center = null //middle of the arena.
var/list/planners = list() //these let you visualize the dimensions of the arena before building it.
var/list/cameras = list() //security cameras.
var/list/spawns = list() //player spawns.
var/list/turfs = list() //all of the arena's turfs. they get reverted to space tiles when the arena is removed.
var/list/swalls = list() //all of the soft walls. randomly spread over the arena between round.
var/list/players = list() //players that registered with this arena.
var/list/tools = list() //clothes and bomb dispensers spawned by the arena.
/datum/bomberman_arena/New(var/turf/a_center=null, var/size="",mob/user)
if(!a_center) return
if(!size) return
if(!user) return
center = a_center
name += " #[rand(1,999)]"
open(size,user)
arenas += src
/datum/bomberman_arena/proc/open(var/size,mob/user)
switch(size)
if("screensized")
if(planner(size,user))
var/obj/machinery/camera/C = new /obj/machinery/camera(center)
cameras += C
C.name = name
C.c_tag = name
C.network = list(
"thunder", //entertainment monitors
"SS13", //security monitors
)
var/obj/structure/planner/pencil = new /obj/structure/planner(center)
pencil.x -= 7
pencil.y -= 7
var/x = pencil.x
var/y = pencil.y
var/w = 14
var/h = 14
var/turf/T = null
under = get_area(pencil)
while (pencil.y <= (y+h)) //placing the Hard Walls and floors
pencil.x = x
while(pencil.x <= (x+w))
T = pencil.loc
if((pencil.y == y) || (pencil.y == (y+h)))
T.ChangeTurf(/turf/unsimulated/wall/bomberman)
T.opacity = 1
turfs += T
else if((pencil.x == x) || (pencil.x == (x+w)))
T.ChangeTurf(/turf/unsimulated/wall/bomberman)
T.opacity = 1
turfs += T
else if((((pencil.x - x)%2) == 0) && (((pencil.y - y)%2) == 0))
T.ChangeTurf(/turf/unsimulated/wall/bomberman)
turfs += T
else
T.ChangeTurf(/turf/simulated/floor/plating)
turfs += T
pencil.x++
sleep(2) //giving the game some time to process to avoid unbearable lag spikes when we create an arena, plus it looks cool.
pencil.y++
pencil.x = x
pencil.y = y //placing the Spawns
pencil.x++
pencil.y++
T = pencil.loc
var/datum/bomberman_spawn/sp1 = new/datum/bomberman_spawn()
sp1.spawnpoint = T
spawns += sp1
pencil.x = x+w-1
T = pencil.loc
var/datum/bomberman_spawn/sp2 = new/datum/bomberman_spawn()
sp2.spawnpoint = T
spawns += sp2
pencil.y = y+h-1
T = pencil.loc
var/datum/bomberman_spawn/sp3 = new/datum/bomberman_spawn()
sp3.spawnpoint = T
spawns += sp3
pencil.x = x+1
T = pencil.loc
var/datum/bomberman_spawn/sp4 = new/datum/bomberman_spawn()
sp4.spawnpoint = T
spawns += sp4
pencil.x = x
pencil.y = y
while (pencil.y <= (y+h)) //placing the Soft Walls
pencil.x = x
while(pencil.x <= (x+w))
T = pencil.loc
if(istype(T, /turf/simulated/floor/plating))
if(prob(60))
T = pencil.loc
var/obj/structure/softwall/W = new /obj/structure/softwall(T)
swalls += W
pencil.x++
sleep(2) //giving the game some time to process to avoid unbearable lag spikes when we create a large arena, plus it looks cool.
pencil.y++
qdel(pencil) //RIP sweet prince
for (var/datum/bomberman_spawn/S in spawns) //removing the soft walls near the spawns
for (var/obj/structure/softwall/W in range(S.spawnpoint,1))
swalls -= W
qdel(W)
//now we just need to add a thunderdome jukebox to every map
var/area/A = new
A.name = name
A.tagbase = "[A.type]_[md5(name)]"
A.tag = "[A.type]/[md5(name)]"
A.master = A
A.power_equip = 0
A.power_light = 0
A.power_environ = 0
A.always_unpowered = 0
A.jammed = SUPER_JAMMED //lol telesci
A.addSorted()
arena = A
spawn(0)
A.contents.Add(turfs)
for(var/turf/F in turfs)
for(var/atom/movable/AM in F)
AM.areaMaster = get_area_master(F)
message_admins("[key_name_admin(user.mind)] created a \"[size]\" Bomberman arena at [center.loc.name] ([center.x],[center.y],[center.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[center.x];Y=[center.y];Z=[center.z]'>JMP</A>)")
log_game("[key_name_admin(user.mind)] created a \"[size]\" Bomberman arena at [center.loc.name] ([center.x],[center.y],[center.z]) ")
else
qdel(src)
if("saturntenplayers")
qdel(src)
/datum/bomberman_arena/proc/reset()
for(var/obj/structure/softwall/W in swalls)
qdel(W)
swalls = list()
for(var/obj/T in tools)
qdel(T)
tools = list()
for(var/mob/M in players)
qdel(M)
players = list()
var/obj/structure/planner/pencil = new /obj/structure/planner(center)
pencil.x -= 7
pencil.y -= 7
var/x = pencil.x
var/y = pencil.y
var/w = 14
var/h = 14
var/turf/T = null
sleep(50) //waiting a moment, in case there are bombs waiting to explode in the arena
while (pencil.y <= (y+h)) //replacing the Soft Walls
pencil.x = x
while(pencil.x <= (x+w))
T = pencil.loc
if(istype(T, /turf/simulated/floor/plating))
if(prob(60))
T = pencil.loc
var/obj/structure/softwall/W = new /obj/structure/softwall(T)
swalls += W
pencil.x++
sleep(2)
pencil.y++
qdel(pencil)
for (var/datum/bomberman_spawn/S in spawns) //removing the soft walls near the spawns
for (var/obj/structure/softwall/W in range(S.spawnpoint,1))
swalls -= W
qdel(W)
/datum/bomberman_arena/proc/close()
for(var/obj/machinery/camera/C in cameras)
qdel(C)
cameras = list()
for(var/obj/structure/softwall/W in swalls)
qdel(W)
swalls = list()
for(var/obj/T in tools)
qdel(T)
tools = list()
for(var/mob/M in players)
qdel(M)
players = list()
under.contents.Add(turfs)
for(var/turf/T in turfs)
for(var/atom/movable/AM in T)
AM.areaMaster = get_area_master(T)
if(under.name == "Space")
T.ChangeTurf(/turf/space)
else
T.ChangeTurf(/turf/simulated/floor/plating)
turfs = list()
arenas -= src
return
/datum/bomberman_arena/proc/planner(var/size,mob/user)
var/choice = 0
switch(size)
if("screensized")
for(var/turf/T in range(center,7))
var/obj/structure/planner/P = new /obj/structure/planner(T)
if(P.loc)
planners += P
if(planners.len == 225)
var/achoice = alert(user, "All those green tiles (that only ghosts can see) will be part of the arena. Do you want to proceed?","Arena Creation", "Confirm","Cancel")
if(achoice=="Confirm")
choice = 1
else
user << "<span class='warning'>Part of the arena was outside the Z-Level.</span>"
if("saturntenplayers")
choice = 0
for (var/obj/structure/planner/P in planners)
qdel(P)
return choice
/obj/structure/planner
name = "arena planner"
icon = 'icons/effects/effects.dmi'
icon_state = "planner"
density = 0
anchored = 1
invisibility = 60
/obj/structure/planner/ex_act(severity)
return
/obj/structure/planner/cultify()
return
/obj/structure/planner/singuloCanEat()
return 0
/obj/structure/bomber_spawn
name = "spawn"
icon = 'icons/effects/effects.dmi'
icon_state = "planner"
density = 0
anchored = 1
invisibility = 60
var/mob/living/carbon/bomber = null
/obj/structure/bomber_spawn/ex_act(severity)
return
/obj/structure/bomber_spawn/cultify()
return
/obj/structure/bomber_spawn/singuloCanEat()
return 0

View File

@@ -60,6 +60,13 @@
if(M_RUN in mutations)
tally = 0
var/skate_bonus = 0
var/disease_slow = 0
for(var/obj/item/weapon/bomberman/dispenser in src)
disease_slow = max(disease_slow, dispenser.slow)
skate_bonus = max(skate_bonus, dispenser.speed_bonus)//if the player is carrying multiple BBD for some reason, he'll benefit from the speed bonus of the most upgraded one
tally = tally - skate_bonus + (6 * disease_slow)
return (tally+config.human_delay)
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
@@ -105,3 +112,7 @@
if(shoes && istype(shoes, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = shoes
S.step_action()
for(var/obj/item/weapon/bomberman/dispenser in src)
if(dispenser.spam_bomb)
dispenser.attack_self(src)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 KiB

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 355 KiB

After

Width:  |  Height:  |  Size: 351 KiB

BIN
icons/obj/bomberman.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

BIN
sound/bomberman/bombed.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sound/bomberman/disease.ogg Normal file

Binary file not shown.

BIN
sound/bomberman/powerup.ogg Normal file

Binary file not shown.

BIN
sound/bomberman/start.ogg Normal file

Binary file not shown.