mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-25 21:19:44 +01:00
Merge pull request #15424 from KillianKirilenko/kk-laserdome
Redgate Laserdome
This commit is contained in:
@@ -127,4 +127,8 @@
|
||||
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms
|
||||
channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1)
|
||||
channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/ent
|
||||
name = "entertainment encryption key"
|
||||
channels = list("Entertainment" = 1)
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
var/show_examine = TRUE // Does this pop up on a mob when the mob is examined?
|
||||
|
||||
var/redgate_allowed = TRUE //can we be taken through the redgate, in either direction?
|
||||
|
||||
/obj/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -92,3 +92,29 @@
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 5,
|
||||
/obj/item/clothing/suit/bluetag = 5)
|
||||
|
||||
/obj/structure/closet/lasertag/red/laserdome
|
||||
name = "red team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/red
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/red = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/red = 3,
|
||||
/obj/item/clothing/head/redtag = 3,
|
||||
/obj/item/clothing/suit/redtag = 3)
|
||||
|
||||
/obj/structure/closet/lasertag/blue/laserdome
|
||||
name = "blue team laserdome equipment"
|
||||
desc = "It's a storage unit for laser tag equipment."
|
||||
closet_appearance = /decl/closet_appearance/wardrobe/blue
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/device/encryptionkey/ent = 3,
|
||||
/obj/item/clothing/gloves/bluespace = 3,
|
||||
/obj/item/clothing/under/color/blue = 3,
|
||||
/obj/item/weapon/gun/energy/lasertag/blue = 3,
|
||||
/obj/item/clothing/head/bluetag = 3,
|
||||
/obj/item/clothing/suit/bluetag = 3)
|
||||
|
||||
@@ -38,6 +38,11 @@
|
||||
if(M.type in restrictions) //Some stuff we don't want to bring EVEN IF it has a key.
|
||||
return
|
||||
|
||||
for(var/obj/O in M.contents)
|
||||
if(O.redgate_allowed == FALSE)
|
||||
to_chat(M, "<span class='warning'>The redgate refuses to allow you to pass whilst you possess \the [O].</span>")
|
||||
return
|
||||
|
||||
if(keycheck) //exceptions probably won't have a ckey
|
||||
if(!M.ckey) //We only want players, no bringing the weird stuff on the other side back
|
||||
return
|
||||
@@ -1058,6 +1063,355 @@
|
||||
name = "Fantasy house"
|
||||
icon_state = "green"
|
||||
|
||||
//HIIIIGHWAY TO THE! LASER-DOME!
|
||||
/area/redgate/laserdome
|
||||
name = "Laserdome Safe Zone"
|
||||
icon_state = "bluwhisqu"
|
||||
dynamic_lighting = 0
|
||||
requires_power = 0
|
||||
|
||||
/area/redgate/laserdome/lobby
|
||||
name = "Laserdome Concourse"
|
||||
icon_state = "greblasqu"
|
||||
|
||||
/area/redgate/laserdome/lobby/restaurant
|
||||
name = "Laserdome Restaurant"
|
||||
|
||||
/area/redgate/laserdome/lobby/aid_station
|
||||
name = "Laserdome First Aid Station"
|
||||
|
||||
/area/redgate/laserdome/lobby/showers
|
||||
name = "Laserdome Showers"
|
||||
|
||||
/area/redgate/laserdome/lobby/store_1
|
||||
name = "Laserdome Store 1"
|
||||
|
||||
/area/redgate/laserdome/lobby/store_2
|
||||
name = "Laserdome Store 2"
|
||||
|
||||
/area/redgate/laserdome/lobby/spaceview_lounge
|
||||
name = "Laserdome Spaceview Lounge"
|
||||
|
||||
/area/redgate/laserdome/arena
|
||||
name = "Laserdome Arenas"
|
||||
icon_state = "yelwhisqu"
|
||||
|
||||
/area/redgate/laserdome/arena/ctf_prep
|
||||
name = "Laserdome Capture The Flag Prep Area"
|
||||
icon_state = "yelwhisqu"
|
||||
|
||||
/area/redgate/laserdome/arena/hbl_prep
|
||||
name = "Laserdome Hyperball Prep Area"
|
||||
icon_state = "yelwhisqu"
|
||||
|
||||
/area/redgate/laserdome/arena/capture_the_flag
|
||||
name = "Laserdome Capture The Flag Arena"
|
||||
icon_state = "redwhitri"
|
||||
|
||||
/area/redgate/laserdome/arena/hyperball
|
||||
name = "Laserdome Hyperball Arena"
|
||||
icon_state = "redwhicir"
|
||||
|
||||
/area/redgate/laserdome/space
|
||||
name = "Laserdome Space View"
|
||||
icon_state = "dark128"
|
||||
|
||||
//The actual flags. Base type defined to handle some of the basic behaviours.
|
||||
/obj/item/weapon/laserdome_flag
|
||||
name = "Flag"
|
||||
desc = "Steal the enemy flag and take it to your base in order to score! First team to three captures wins! Or was it five? Eh, check with the referee I guess."
|
||||
description_info = "Simply pick up your team's flag to return it to your base after a short delay. If you're carrying the enemy flag, use it on your team's flag base to score a point!"
|
||||
slowdown = 1 //big flag is harder to run with, encourages teamwork and lets the opposing team catch up. would be nice if this was a forced slowdown that ignores hardy.
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
|
||||
)
|
||||
item_state = "laserdome_flag"
|
||||
icon_state = "flag"
|
||||
var/laser_team = "neutral"
|
||||
w_class = ITEMSIZE_NO_CONTAINER //no stashing the flag in a bag for you, bucko!
|
||||
redgate_allowed = FALSE //no running off the map with the flags either
|
||||
var/start_pos
|
||||
var/flag_return_delay = 3 SECONDS //how long you have to hold onto your team's flag before it returns home
|
||||
|
||||
/obj/item/weapon/laserdome_flag/Initialize()
|
||||
. = ..()
|
||||
start_pos = src.loc //save our starting location for later
|
||||
|
||||
/*
|
||||
//TODO - make this not trigger when the flag is returned to its original location
|
||||
/obj/item/weapon/laserdome_flag/dropped()
|
||||
. = ..()
|
||||
global_announcer.autosay("[src] dropped!","Laserdome Announcer","Entertainment")
|
||||
*/
|
||||
|
||||
/obj/item/weapon/laserdome_flag/attack_hand(mob/user as mob)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/M = loc
|
||||
var/grabbing_team
|
||||
|
||||
//if they're not a carbon, we don't care
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
//get their uniform
|
||||
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
|
||||
grabbing_team = "red"
|
||||
else if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
|
||||
grabbing_team = "blue"
|
||||
else
|
||||
return //if they're not on a team, stop!
|
||||
|
||||
//set the verb based on matching (or mismatching) outfits, and teleport the flag back to base if it was touched by the owning team
|
||||
if(grabbing_team == laser_team)
|
||||
user.visible_message("<span class='warning'>[user] is returning \the [src]!</span>")
|
||||
if(do_after(user,flag_return_delay)) //channel return, rather than instant
|
||||
user.drop_from_inventory(src)
|
||||
src.loc = src.start_pos
|
||||
global_announcer.autosay("[capitalize(laser_team)] flag returned by [user]!","Laserdome Announcer","Entertainment")
|
||||
else //if they fail the channel (e.g. because they got tagged!) then drop it
|
||||
user.drop_from_inventory(src)
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] has taken \the [src]!</span>")
|
||||
global_announcer.autosay("[src] taken by [capitalize(grabbing_team)] team!","Laserdome Announcer","Entertainment")
|
||||
|
||||
/obj/item/weapon/laserdome_flag/red
|
||||
name = "Red flag"
|
||||
icon_state = "red_flag"
|
||||
item_state = "laserdome_flag_red"
|
||||
laser_team = "red"
|
||||
|
||||
/obj/item/weapon/laserdome_flag/blue
|
||||
name = "Blue flag"
|
||||
icon_state = "blue_flag"
|
||||
item_state = "laserdome_flag_blue"
|
||||
laser_team = "blue"
|
||||
|
||||
//Finally, the flag bases. Both bases *must* be in the same map area (e.g. /area/ctf_arena) for the scoring system to work properly. But if they are, then it's basically just spawn-and-play, no other setup needed!
|
||||
/obj/structure/flag_base
|
||||
name = "Flag base"
|
||||
desc = "Where your flag rests. Bring the enemy flag here to score!"
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "flag_base"
|
||||
anchored = TRUE
|
||||
var/base_team
|
||||
var/score = 0
|
||||
var/score_limit = 3
|
||||
|
||||
/obj/structure/flag_base/blue
|
||||
name = "Blue team flag base"
|
||||
base_team = "blue"
|
||||
|
||||
/obj/structure/flag_base/red
|
||||
name = "Red team flag base"
|
||||
base_team = "red"
|
||||
|
||||
/obj/structure/flag_decor
|
||||
name = "Decorative flag"
|
||||
desc = "A decorative flag."
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "flag"
|
||||
|
||||
/obj/structure/flag_decor/blue
|
||||
icon_state = "blue_flag_deco"
|
||||
|
||||
/obj/structure/flag_decor/red
|
||||
icon_state = "red_flag_deco"
|
||||
|
||||
/obj/structure/flag_base/attackby(obj/F as obj, mob/user as mob)
|
||||
. = ..()
|
||||
|
||||
//TODO- require the team's flag to be present before they can score?
|
||||
if(istype(F,/obj/item/weapon/laserdome_flag))
|
||||
var/obj/item/weapon/laserdome_flag/flag = F
|
||||
if(flag.laser_team != base_team)
|
||||
global_announcer.autosay("[user] captured the [capitalize(flag.laser_team)] flag for [capitalize(base_team)] team!","Laserdome Announcer","Entertainment")
|
||||
user.drop_from_inventory(flag)
|
||||
flag.loc = flag.start_pos //teleport the captured flag back to its base location
|
||||
score++ //increment our score by 1!
|
||||
if(score < score_limit) //announce the current score and how many more captures are needed
|
||||
global_announcer.autosay("[num2text(score_limit-score)] captures remain until [capitalize(base_team)] team wins.","Laserdome Announcer","Entertainment")
|
||||
else if(score >= score_limit) //now, if score equals or exceeds (somehow) the score limit, announce that our team won and reset the score for all flag bases nearby
|
||||
global_announcer.autosay("+|[uppertext(base_team)] TEAM HAS WON THE MATCH!|+","Laserdome Announcer","Entertainment")
|
||||
for(var/obj/structure/flag_base/FB in src.loc.loc.contents) //this feels dirty, but it works
|
||||
FB.score = 0
|
||||
else if(flag.laser_team == base_team)
|
||||
global_announcer.autosay("[capitalize(base_team)] flag returned!","Laserdome Announcer","Entertainment")
|
||||
user.drop_from_inventory(flag)
|
||||
flag.loc = src.loc //place our flag neatly back on its pedestal
|
||||
|
||||
/obj/item/weapon/laserdome_hyperball
|
||||
name = "\improper HYPERball" //*always* refer to it as "the hyperball", not just "the ball". corporate insists.
|
||||
desc = "Because regular balls aren't exciting enough, the future needs HYPERballs!"
|
||||
description_info = "Take the ball and dunk it into the opposing team's goal to score! You can either throw it into the goal or dunk it directly; the latter is worth more points, but it's more challenging as you need to be next to the goal in order to dunk."
|
||||
slowdown = -0.5 //carrying the ball actually speeds you up a little bit? given you need to get past enemy defense and dunk. also makes it easier to get the ball away from your base if you intercept.
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "hyperball"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
|
||||
)
|
||||
item_state = "hyperball"
|
||||
w_class = ITEMSIZE_NO_CONTAINER //no shoving it in your backpack to hide it
|
||||
redgate_allowed = FALSE //you can't take your ball and go home
|
||||
var/start_pos
|
||||
var/last_holder
|
||||
var/last_team
|
||||
|
||||
/obj/item/weapon/laserdome_hyperball_prop
|
||||
name = "demonstration HYPERball"
|
||||
desc = "Because regular balls aren't exciting enough, the future needs HYPERballs!"
|
||||
description_info = "This model is for demonstration purposes only. It looks pretty heavy!"
|
||||
slowdown = 3 //really discourage people from trying to actually use these in the game if they get them out of the display cases
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "hyperball"
|
||||
w_class = ITEMSIZE_NO_CONTAINER
|
||||
redgate_allowed = FALSE //you can't take the demonstration balls and go home either
|
||||
|
||||
/obj/item/weapon/laserdome_hyperball/Initialize()
|
||||
. = ..()
|
||||
start_pos = src.loc //save our starting location for later
|
||||
|
||||
/obj/item/weapon/laserdome_hyperball/attack_hand(mob/user as mob)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/M = loc
|
||||
var/grabbing_team
|
||||
|
||||
//if they're not a carbon, we don't care
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
//get their uniform
|
||||
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
|
||||
grabbing_team = "red"
|
||||
icon_state = "[initial(icon_state)]_red"
|
||||
item_state = "[initial(icon_state)]_red"
|
||||
else if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
|
||||
grabbing_team = "blue"
|
||||
icon_state = "[initial(icon_state)]_blue"
|
||||
item_state = "[initial(icon_state)]_blue"
|
||||
else
|
||||
return //if they're not on a team, stop!
|
||||
|
||||
user.visible_message("<span class='warning'>[user] has taken \the [src]!</span>")
|
||||
//cache our grabber and their team, for throw interactions with the goals later
|
||||
last_holder = M
|
||||
last_team = grabbing_team
|
||||
//finally, announcer calls out which team has the ball
|
||||
global_announcer.autosay("[capitalize(grabbing_team)] team on offense!","Laserdome Announcer","Entertainment")
|
||||
update_icon()
|
||||
update_held_icon()
|
||||
|
||||
/*
|
||||
//TODO- make this not trigger when the ball is thrown or dunked, only when it's actually dropped
|
||||
/obj/item/weapon/laserdome_hyperball/dropped()
|
||||
. = ..()
|
||||
global_announcer.autosay("[capitalize(last_team)] fumble!","Laserdome Announcer","Entertainment")
|
||||
*/
|
||||
|
||||
/obj/structure/hyperball_pedestal
|
||||
name = "HYPERball pedestal"
|
||||
desc = "A fancy stand that the hyperball appears on. Looks strangely like one of the goals, come to think of it..."
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "hyperball_stand"
|
||||
anchored = TRUE
|
||||
|
||||
//Finally, the goal objects. Like the flag bases, both goals *must* be in the same map area (e.g. /area/hyperball_arena) for the scoring system to work properly. But if they are, then it's basically just spawn-and-play, no other setup needed!
|
||||
/obj/structure/hyperball_goal
|
||||
name = "HYPERball goal"
|
||||
desc = "A dangerous-looking hole, with an energy net that stops anything but a hyperball from passing through."
|
||||
description_info = "Dunk the hyperball here to score! Just don't get an own goal. Alternately, throw the ball in for less points. There's a chance you'll miss, or an enemy team member might get in the way, but it can be easier than getting close enough for a dunk."
|
||||
icon = 'icons/obj/flags.dmi'
|
||||
icon_state = "hyperball_goal"
|
||||
anchored = TRUE
|
||||
var/goal_team
|
||||
var/score = 0
|
||||
var/score_limit = 21 //3 hand-dunks (hard), or 7 throws (easy), or any combination thereof
|
||||
var/dunk_points = 7
|
||||
var/range_dunk_points = 3
|
||||
var/range_dunk_chance = 75 //chance for a ranged dunk to "hit" the goal
|
||||
|
||||
/obj/structure/hyperball_goal/blue
|
||||
name = "Blue team HYPERball goal"
|
||||
icon_state = "hyperball_goal_blue"
|
||||
goal_team = "blue"
|
||||
|
||||
/obj/structure/hyperball_goal/red
|
||||
name = "Red team HYPERball goal"
|
||||
icon_state = "hyperball_goal_red"
|
||||
goal_team = "red"
|
||||
|
||||
/obj/structure/hyperball_goal/attackby(obj/B as obj, mob/user as mob)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/M = user
|
||||
var/dunking_team
|
||||
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
|
||||
dunking_team = "red"
|
||||
else if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
|
||||
dunking_team = "blue"
|
||||
else
|
||||
return //if they're not on a team, stop!
|
||||
|
||||
if(istype(B,/obj/item/weapon/laserdome_hyperball))
|
||||
var/obj/item/weapon/laserdome_hyperball/ball = B
|
||||
if(dunking_team != goal_team)
|
||||
global_announcer.autosay("[user] dunked the HYPERball for [capitalize(dunking_team)] team! [num2text(dunk_points)] points scored!","Laserdome Announcer","Entertainment")
|
||||
score += dunk_points //increment our score!
|
||||
if(score < score_limit) //announce the current score and how many more captures are needed
|
||||
global_announcer.autosay("[num2text(score_limit-score)] points remain until [capitalize(dunking_team)] team wins.","Laserdome Announcer","Entertainment")
|
||||
else if(score >= score_limit) //now, if score equals or exceeds (somehow) the score limit, announce that our team won and reset the score for all flag bases nearby
|
||||
global_announcer.autosay("+|[uppertext(dunking_team)] TEAM HAS WON THE MATCH!|+","Laserdome Announcer","Entertainment")
|
||||
for(var/obj/structure/hyperball_goal/HB in src.loc.loc.contents) //this feels dirty, but it works
|
||||
HB.score = 0
|
||||
else if(dunking_team == goal_team) //discourage people from dunking the ball into their own goal as a quick way to teleport it back to the midfield
|
||||
switch(goal_team) //this gets a bit fiddly because we store our score on the target's goal, so we need to scan the map for the opposing team's goal and deduct points from it
|
||||
if("blue")
|
||||
for(var/obj/structure/hyperball_goal/red/HGR in src.loc.loc.contents)
|
||||
HGR.score = max(0,HGR.score-dunk_points)
|
||||
global_announcer.autosay("[user] dunked the HYPERball and scored an own goal! +Points |de-ducted!|+ [capitalize(goal_team)] team score is now: [HGR.score].","Laserdome Announcer","Entertainment")
|
||||
if("red")
|
||||
for(var/obj/structure/hyperball_goal/blue/HGB in src.loc.loc.contents)
|
||||
HGB.score = max(0,HGB.score-dunk_points)
|
||||
global_announcer.autosay("[user] dunked the HYPERball and scored an own goal! +Points |de-ducted!|+ [capitalize(goal_team)] team score is now: [HGB.score].","Laserdome Announcer","Entertainment")
|
||||
|
||||
user.drop_from_inventory(ball)
|
||||
ball.loc = ball.start_pos //teleport the ball back to the midfield
|
||||
ball.icon_state = "[initial(ball.icon_state)]"
|
||||
ball.item_state = "[initial(ball.item_state)]"
|
||||
ball.update_icon()
|
||||
|
||||
/obj/structure/hyperball_goal/hitby(obj/B as obj)
|
||||
. = ..()
|
||||
if(istype(B,/obj/item/weapon/laserdome_hyperball))
|
||||
var/obj/item/weapon/laserdome_hyperball/ball = B
|
||||
if(prob(range_dunk_chance))
|
||||
if(ball.last_team != goal_team)
|
||||
global_announcer.autosay("[ball.last_holder] threw the HYPERball for [capitalize(ball.last_team)] team! [num2text(range_dunk_points)] points scored!","Laserdome Announcer","Entertainment")
|
||||
score += range_dunk_points //increment our score!
|
||||
if(score < score_limit) //announce the current score and how many more captures are needed
|
||||
global_announcer.autosay("[num2text(score_limit-score)] points remain until [capitalize(ball.last_team)] team wins.","Laserdome Announcer","Entertainment")
|
||||
else if(score >= score_limit) //now, if score equals or exceeds the score limit, announce that our team won and reset the score for all flag bases nearby
|
||||
global_announcer.autosay("+|[uppertext(ball.last_team)] TEAM HAS WON THE MATCH!|+","Laserdome Announcer","Entertainment")
|
||||
for(var/obj/structure/hyperball_goal/HB in src.loc.loc.contents) //this feels dirty, but it works
|
||||
HB.score = 0
|
||||
else if(ball.last_team == goal_team) //discourage people from dunking the ball into their own goal as a quick way to teleport it back to the midfield
|
||||
switch(goal_team) //this gets a bit fiddly because we store our score on the target's goal, so we need to scan the map for the opposing team's goal and deduct points from it
|
||||
if("blue")
|
||||
for(var/obj/structure/hyperball_goal/red/HGR in src.loc.loc.contents)
|
||||
HGR.score = max(0,HGR.score-range_dunk_points)
|
||||
global_announcer.autosay("[ball.last_holder] threw the HYPERball and scored an own goal! +Points |de-ducted!|+ [capitalize(goal_team)] team score is now: [HGR.score].","Laserdome Announcer","Entertainment")
|
||||
if("red")
|
||||
for(var/obj/structure/hyperball_goal/blue/HGB in src.loc.loc.contents)
|
||||
HGB.score = max(0,HGB.score-range_dunk_points)
|
||||
global_announcer.autosay("[ball.last_holder] threw the HYPERball and scored an own goal! +Points |de-ducted!|+ [capitalize(goal_team)] team score is now: [HGB.score].","Laserdome Announcer","Entertainment")
|
||||
|
||||
ball.loc = ball.start_pos //teleport the ball back to the midfield
|
||||
ball.icon_state = "[initial(ball.icon_state)]"
|
||||
ball.item_state = "[initial(ball.item_state)]"
|
||||
ball.update_icon()
|
||||
else
|
||||
//todo; throw the ball in a random direction
|
||||
src.visible_message("\The [ball] bounces off \the [src]'s rim!")
|
||||
global_announcer.autosay("[ball.last_holder] threw the HYPERball and +missed!+ |Oooh!|","Laserdome Announcer","Entertainment")
|
||||
@@ -12,6 +12,8 @@
|
||||
* Lasertag
|
||||
*/
|
||||
|
||||
#define LASER_TAG_HEALTH 3 //how many strikes do we get?
|
||||
|
||||
/obj/item/clothing/suit/bluetag
|
||||
name = "blue laser tag armor"
|
||||
desc = "Blue Pride, Station Wide."
|
||||
@@ -21,10 +23,11 @@
|
||||
body_parts_covered = UPPER_TORSO
|
||||
allowed = list (/obj/item/weapon/gun/energy/lasertag/blue)
|
||||
siemens_coefficient = 3.0
|
||||
var/lasertag_health = LASER_TAG_HEALTH
|
||||
|
||||
/obj/item/clothing/suit/bluetag/sub
|
||||
name = "Brigader Armor"
|
||||
desc = "Repilca rmor commonly worn by Spacer Union Brigade members from the hit series Spacer Trail. Modified for Laser Tag (Blue Team)."
|
||||
desc = "Replica armor commonly worn by Spacer Union Brigade members from the hit series Spacer Trail. Modified for Laser Tag (Blue Team)."
|
||||
icon_state = "bluetag2"
|
||||
|
||||
/obj/item/clothing/suit/redtag
|
||||
@@ -36,10 +39,11 @@
|
||||
body_parts_covered = UPPER_TORSO
|
||||
allowed = list (/obj/item/weapon/gun/energy/lasertag/red)
|
||||
siemens_coefficient = 3.0
|
||||
var/lasertag_health = LASER_TAG_HEALTH
|
||||
|
||||
/obj/item/clothing/suit/redtag/dom
|
||||
name = "Mu'tu'bi Armor"
|
||||
desc = "Repilca rmor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
|
||||
desc = "Replica armor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
|
||||
icon_state = "redtag2"
|
||||
|
||||
/*
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
/mob/living/carbon/human/dummy/mannequin/autoequip
|
||||
icon = 'icons/mob/human_races/r_human.dmi'
|
||||
icon_state = "preview"
|
||||
var/autorotate = TRUE
|
||||
|
||||
/mob/living/carbon/human/dummy/mannequin/autoequip/Initialize()
|
||||
icon = null
|
||||
@@ -32,7 +33,8 @@
|
||||
. = ..()
|
||||
|
||||
dress_up()
|
||||
turntable()
|
||||
if(autorotate)
|
||||
turntable()
|
||||
|
||||
/mob/living/carbon/human/dummy/mannequin/autoequip/proc/dress_up()
|
||||
set waitfor = FALSE
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/lasertag
|
||||
name = "laser tag gun"
|
||||
desc = "Standard issue weapon of the Imperial Guard"
|
||||
desc = "Standard issue weapon of the Imperial Guard."
|
||||
icon = 'icons/obj/gun_toy.dmi'
|
||||
item_state = "omnitag"
|
||||
item_state = "retro"
|
||||
@@ -286,6 +286,12 @@
|
||||
item_state = "bluetag"
|
||||
projectile_type = /obj/item/projectile/beam/lasertag/blue
|
||||
required_vest = /obj/item/clothing/suit/bluetag
|
||||
fire_delay = 10
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="instagib rules", fire_delay=10, projectile_type=/obj/item/projectile/beam/lasertag/blue, charge_cost = 240),
|
||||
list(mode_name="multi-hit rules", fire_delay=5, projectile_type=/obj/item/projectile/beam/lasertag/blue/multihit, charge_cost = 120),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/lasertag/blue/sub
|
||||
name = "Brigader Sidearm"
|
||||
@@ -298,6 +304,12 @@
|
||||
item_state = "redtag"
|
||||
projectile_type = /obj/item/projectile/beam/lasertag/red
|
||||
required_vest = /obj/item/clothing/suit/redtag
|
||||
fire_delay = 10
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="instagib rules", fire_delay=12, projectile_type=/obj/item/projectile/beam/lasertag/red, charge_cost = 240),
|
||||
list(mode_name="multi-hit rules", fire_delay=5, projectile_type=/obj/item/projectile/beam/lasertag/red/multihit, charge_cost = 120),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/lasertag/red/dom
|
||||
name = "Mu'tu'bi sidearm"
|
||||
|
||||
@@ -242,6 +242,23 @@
|
||||
M.Weaken(5)
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/beam/lasertag/blue/multhit
|
||||
name = "blue multi-hit lasertag beam"
|
||||
|
||||
/obj/item/projectile/beam/lasertag/blue/multihit/on_hit(var/atom/target, var/blocked = 0)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/M = target
|
||||
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
|
||||
var/obj/item/clothing/suit/redtag/S = M.wear_suit
|
||||
if (S.lasertag_health <= 1)
|
||||
M.Weaken(5)
|
||||
to_chat(M,"<span class='warning'>You have been defeated!</span>")
|
||||
S.lasertag_health = initial(S.lasertag_health)
|
||||
else
|
||||
S.lasertag_health--
|
||||
to_chat(M,"<span class='warning'>Danger! You have [num2text(S.lasertag_health)] hits remaining!</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/beam/lasertag/red
|
||||
icon_state = "laser"
|
||||
light_color = "#FF0D00"
|
||||
@@ -254,6 +271,23 @@
|
||||
M.Weaken(5)
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/beam/lasertag/red/multhit
|
||||
name = "red multi-hit lasertag beam"
|
||||
|
||||
/obj/item/projectile/beam/lasertag/red/multihit/on_hit(var/atom/target, var/blocked = 0)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/M = target
|
||||
if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
|
||||
var/obj/item/clothing/suit/bluetag/S = M.wear_suit
|
||||
if(S.lasertag_health <= 1)
|
||||
M.Weaken(5)
|
||||
to_chat(M,"<span class='warning'>You have been defeated!</span>")
|
||||
S.lasertag_health = initial(S.lasertag_health)
|
||||
else
|
||||
S.lasertag_health--
|
||||
to_chat(M,"<span class='warning'>Danger! You have [num2text(S.lasertag_health)] hits remaining!</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE
|
||||
icon_state = "omnilaser"
|
||||
light_color = "#00C6FF"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 58 KiB |
@@ -221,7 +221,8 @@
|
||||
list("Redgate - Rain City"),
|
||||
list("Redgate - Islands Underwater","Redgate - Islands"),
|
||||
list("Redgate - Moving Train", "Redgate - Moving Train Upper Level"),
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town")
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
|
||||
list("Redgate - Laserdome")
|
||||
)
|
||||
|
||||
lateload_gb_north = list(
|
||||
|
||||
@@ -327,6 +327,11 @@
|
||||
/obj/effect/landmark/map_data/fantasy
|
||||
height = 2
|
||||
|
||||
/datum/map_template/common_lateload/redgate/laserdome
|
||||
name = "Redgate - Laserdome"
|
||||
desc = "A large orbital station with recreational facilities, namely a pair of laser tag arenas."
|
||||
mappath = 'maps/redgate/laserdome.dmm'
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
// Admin-use z-levels for loading whenever an admin feels like
|
||||
#if AWAY_MISSION_TEST
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -178,7 +178,8 @@
|
||||
list("Redgate - Rain City"),
|
||||
list("Redgate - Islands Underwater","Redgate - Islands"),
|
||||
list("Redgate - Moving Train", "Redgate - Moving Train Upper Level"),
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town")
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
|
||||
list("Redgate - Laserdome")
|
||||
)
|
||||
|
||||
ai_shell_restricted = TRUE
|
||||
|
||||
@@ -208,7 +208,8 @@
|
||||
list("Redgate - Rain City"),
|
||||
list("Redgate - Islands Underwater","Redgate - Islands"),
|
||||
list("Redgate - Moving Train", "Redgate - Moving Train Upper Level"),
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town")
|
||||
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
|
||||
list("Redgate - Laserdome")
|
||||
)
|
||||
|
||||
ai_shell_restricted = TRUE
|
||||
|
||||
Reference in New Issue
Block a user