mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into sync
This commit is contained in:
@@ -28,6 +28,16 @@
|
||||
return list("title" = title, "message" = message)
|
||||
|
||||
/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
|
||||
for (var/obj/machinery/computer/communications/C in machines)
|
||||
if(! (C.stat & (BROKEN|NOPOWER) ) )
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
|
||||
P.name = "'[command_name()] Update.'"
|
||||
P.info = replacetext(args["message"], "\n", "<br/>")
|
||||
P.update_space(P.info)
|
||||
P.update_icon()
|
||||
C.messagetitle.Add(args["title"])
|
||||
C.messagetext.Add(P.info)
|
||||
|
||||
command_announcement.Announce(args["message"], args["title"])
|
||||
return 1
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ var/datum/antagonist/mercenary/mercs
|
||||
|
||||
hard_cap = 4
|
||||
hard_cap_round = 8
|
||||
initial_spawn_req = 4
|
||||
initial_spawn_target = 6
|
||||
initial_spawn_req = 3
|
||||
initial_spawn_target = 4
|
||||
|
||||
/datum/antagonist/mercenary/New()
|
||||
..()
|
||||
|
||||
@@ -14,8 +14,8 @@ var/datum/antagonist/raider/raiders
|
||||
|
||||
hard_cap = 6
|
||||
hard_cap_round = 10
|
||||
initial_spawn_req = 4
|
||||
initial_spawn_target = 6
|
||||
initial_spawn_req = 3
|
||||
initial_spawn_target = 4
|
||||
|
||||
id_type = /obj/item/weapon/card/id/syndicate
|
||||
|
||||
|
||||
@@ -7,9 +7,9 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
/datum/game_mode/heist
|
||||
name = "Heist"
|
||||
config_tag = "heist"
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
required_players = 8
|
||||
required_players_secret = 8
|
||||
required_enemies = 3
|
||||
round_description = "An unidentified bluespace signature is approaching the station!"
|
||||
extended_round_description = "The Company's majority control of phoron in "+starsys_name+" has marked the \
|
||||
station to be a highly valuable target for many competing organizations and individuals. Being a \
|
||||
|
||||
@@ -12,9 +12,9 @@ var/list/nuke_disks = list()
|
||||
colony of sizable population and considerable wealth causes it to often be the target of various \
|
||||
attempts of robbery, fraud and other malicious actions."
|
||||
config_tag = "mercenary"
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 1
|
||||
required_players = 8
|
||||
required_players_secret = 8
|
||||
required_enemies = 3
|
||||
end_on_antag_death = 0
|
||||
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
||||
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
//Body Scan Console
|
||||
/obj/machinery/body_scanconsole
|
||||
var/obj/machinery/bodyscanner/scanner
|
||||
var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
|
||||
var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal)
|
||||
var/delete
|
||||
var/temphtml
|
||||
name = "Body Scanner Console"
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
if(user.species.can_shred(user))
|
||||
set_status(0)
|
||||
user.do_attack_animation(src)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
visible_message("<span class='warning'>\The [user] slashes at [src]!</span>")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
add_hiddenprint(user)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/active = 0
|
||||
|
||||
/obj/machinery/computer/aifixer/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/aifixer/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user)
|
||||
|
||||
@@ -253,7 +253,7 @@
|
||||
desc = "Used to access the various cameras on the outpost."
|
||||
icon_keyboard = "mining_key"
|
||||
icon_screen = "mining"
|
||||
network = list("MINE")
|
||||
network = list("Mining Outpost")
|
||||
circuit = /obj/item/weapon/circuitboard/security/mining
|
||||
light_color = "#F9BBFC"
|
||||
|
||||
|
||||
@@ -413,7 +413,7 @@
|
||||
if(istype(W,/obj/item/weapon/implant/health))
|
||||
for(var/obj/machinery/computer/cloning/com in world)
|
||||
for(var/datum/dna2/record/R in com.records)
|
||||
if(R.implant == W)
|
||||
if(locate(R.implant) == W)
|
||||
qdel(R)
|
||||
qdel(W)
|
||||
|
||||
|
||||
@@ -160,6 +160,8 @@
|
||||
if(H.species.can_shred(H))
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("<span class='danger'>[user] smashes against the [src.name].</span>", 1)
|
||||
user.do_attack_animation(src)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
take_damage(25)
|
||||
return
|
||||
return src.attackby(user, user)
|
||||
|
||||
@@ -780,8 +780,8 @@
|
||||
name = "SweatMAX"
|
||||
desc = "Fueled by your inner inadequacy!"
|
||||
icon_state = "fitness"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 8,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 8,
|
||||
products = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 8,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 8,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 8,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 8,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 8,
|
||||
@@ -789,8 +789,8 @@
|
||||
/obj/item/weapon/reagent_containers/pill/diet = 8,
|
||||
/obj/item/weapon/towel/random = 8)
|
||||
|
||||
prices = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 3,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 3,
|
||||
prices = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 3,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 3,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 20,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 5,
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
cell = C
|
||||
return
|
||||
cell = new(src)
|
||||
cell.name = "high-capacity power cell"
|
||||
cell.name = "mecha power cell"
|
||||
cell.charge = 15000
|
||||
cell.maxcharge = 15000
|
||||
|
||||
@@ -514,6 +514,7 @@
|
||||
if(H.species.can_shred(user))
|
||||
if(!prob(src.deflect_chance))
|
||||
src.take_damage(15)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1)
|
||||
user << "<span class='danger'>You slash at the armored suit!</span>"
|
||||
|
||||
@@ -77,6 +77,8 @@
|
||||
desc = "They seem to pulse slightly with an inner life"
|
||||
icon_state = "eggs"
|
||||
var/amount_grown = 0
|
||||
var/spiders_min = 6
|
||||
var/spiders_max = 24
|
||||
New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
@@ -97,7 +99,7 @@
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(6,24)
|
||||
var/num = rand(spiders_min, spiders_max)
|
||||
var/obj/item/organ/external/O = null
|
||||
if(istype(loc, /obj/item/organ/external))
|
||||
O = loc
|
||||
@@ -108,6 +110,10 @@
|
||||
O.implants += spiderling
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/eggcluster/small
|
||||
spiders_min = 1
|
||||
spiders_max = 3
|
||||
|
||||
/obj/effect/spider/spiderling
|
||||
name = "spiderling"
|
||||
desc = "It never stays still for long."
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/obj/item/weapon/circuitboard/security/mining
|
||||
name = T_BOARD("mining camera monitor")
|
||||
build_path = /obj/machinery/computer/security/mining
|
||||
network = list("MINE")
|
||||
network = list("Mining Outpost")
|
||||
req_access = list()
|
||||
|
||||
/obj/item/weapon/circuitboard/security/telescreen/entertainment
|
||||
|
||||
@@ -285,4 +285,59 @@
|
||||
/obj/item/weapon/anobattery,
|
||||
/obj/item/device/ano_scanner,
|
||||
/obj/item/weapon/pickaxe/hand
|
||||
)
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack
|
||||
name = "leather fannypack"
|
||||
desc = "A dorky fannypack for keeping small items in."
|
||||
icon_state = "fannypack_leather"
|
||||
item_state = "fannypack_leather"
|
||||
max_w_class = ITEMSIZE_SMALL
|
||||
storage_slots = null
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 2
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/black
|
||||
name = "black fannypack"
|
||||
icon_state = "fannypack_black"
|
||||
item_state = "fannypack_black"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/blue
|
||||
name = "blue fannypack"
|
||||
icon_state = "fannypack_blue"
|
||||
item_state = "fannypack_blue"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/cyan
|
||||
name = "cyan fannypack"
|
||||
icon_state = "fannypack_cyan"
|
||||
item_state = "fannypack_cyan"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/green
|
||||
name = "green fannypack"
|
||||
icon_state = "fannypack_green"
|
||||
item_state = "fannypack_green"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/orange
|
||||
name = "orange fannypack"
|
||||
icon_state = "fannypack_orange"
|
||||
item_state = "fannypack_orange"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/purple
|
||||
name = "purple fannypack"
|
||||
icon_state = "fannypack_purple"
|
||||
item_state = "fannypack_purple"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/red
|
||||
name = "red fannypack"
|
||||
icon_state = "fannypack_red"
|
||||
item_state = "fannypack_red"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/white
|
||||
name = "white fannypack"
|
||||
icon_state = "fannypack_white"
|
||||
item_state = "fannypack_white"
|
||||
|
||||
/obj/item/weapon/storage/belt/fannypack/yellow
|
||||
name = "yellow fannypack"
|
||||
icon_state = "fannypack_yellow"
|
||||
item_state = "fannypack_yellow"
|
||||
|
||||
|
||||
@@ -50,10 +50,10 @@
|
||||
if (!( user.restrained() ) && !( user.stat ))
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
user.u_equip(master_item)
|
||||
user.unEquip(master_item)
|
||||
user.put_in_r_hand(master_item)
|
||||
if("l_hand")
|
||||
user.u_equip(master_item)
|
||||
user.unEquip(master_item)
|
||||
user.put_in_l_hand(master_item)
|
||||
master_item.add_fingerprint(user)
|
||||
return 0
|
||||
|
||||
@@ -77,10 +77,10 @@
|
||||
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
usr.u_equip(src)
|
||||
usr.unEquip(src)
|
||||
usr.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
usr.u_equip(src)
|
||||
usr.unEquip(src)
|
||||
usr.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
|
||||
@@ -1245,7 +1245,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
M = whom
|
||||
C = M.client
|
||||
else
|
||||
return "<b>(*not an mob*)</b>"
|
||||
return "<b>(*not a mob*)</b>"
|
||||
switch(detail)
|
||||
if(0)
|
||||
return "<b>[key_name(C, link, name, highlight_special)]</b>"
|
||||
@@ -1255,15 +1255,15 @@ proc/admin_notice(var/message, var/rights)
|
||||
|
||||
if(2) //Admins
|
||||
var/ref_mob = "\ref[M]"
|
||||
return "<b>[key_name(C, link, name, highlight_special)](<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)</b>"
|
||||
return "<b>[key_name(C, link, name, highlight_special)](<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;take_question=\ref[M]'>TAKE</A>)</b>"
|
||||
|
||||
if(3) //Devs
|
||||
var/ref_mob = "\ref[M]"
|
||||
return "<b>[key_name(C, link, name, highlight_special)](<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>)([admin_jump_link(M, src)])</b>"
|
||||
return "<b>[key_name(C, link, name, highlight_special)](<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>)([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;take_question=\ref[M]'>TAKE</A>)</b>"
|
||||
|
||||
if(4) //Mentors
|
||||
var/ref_mob = "\ref[M]"
|
||||
return "<b>[key_name(C, link, name, highlight_special)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)])</b>"
|
||||
return "<b>[key_name(C, link, name, highlight_special)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;take_question=\ref[M]'>TAKE</A>)</b>"
|
||||
|
||||
|
||||
/proc/ishost(whom)
|
||||
|
||||
@@ -1218,6 +1218,18 @@
|
||||
else if(href_list["check_antagonist"])
|
||||
check_antagonists()
|
||||
|
||||
else if(href_list["take_question"])
|
||||
|
||||
var/mob/M = locate(href_list["take_question"])
|
||||
if(ismob(M))
|
||||
var/take_msg = "<span class='notice'><b>ADMINHELP</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> adminhelp, please don't dogpile them.</span>"
|
||||
for(var/client/X in admins)
|
||||
if((R_ADMIN|R_MOD|R_MENTOR) & X.holder.rights)
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your adminhelp is being attended to by [usr.client]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
|
||||
|
||||
else if(href_list["adminplayerobservecoodjump"])
|
||||
if(!check_rights(R_ADMIN|R_SERVER|R_MOD)) return
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/device/assembly/signaler
|
||||
name = "remote signaling device"
|
||||
desc = "Used to remotely activate devices."
|
||||
desc = "Used to remotely activate devices. Tap against another secured signaler to transfer configuration."
|
||||
icon_state = "signaller"
|
||||
item_state = "signaler"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
@@ -98,6 +98,15 @@
|
||||
|
||||
return
|
||||
|
||||
attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(issignaler(W))
|
||||
var/obj/item/device/assembly/signaler/signaler2 = W
|
||||
if(secured && signaler2.secured)
|
||||
code = signaler2.code
|
||||
frequency = signaler2.frequency
|
||||
user << "You transfer the frequency and code of [signaler2] to [src]"
|
||||
else
|
||||
..()
|
||||
|
||||
proc/signal()
|
||||
if(!radio_connection) return
|
||||
|
||||
@@ -280,6 +280,18 @@
|
||||
path = /obj/item/clothing/accessory/storage/white_drop_pouches
|
||||
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
|
||||
|
||||
/datum/gear/accessory/fannypack
|
||||
display_name = "fannypack selection"
|
||||
cost = 2
|
||||
|
||||
/datum/gear/accessory/fannypack/New()
|
||||
..()
|
||||
var/list/fannys = list()
|
||||
for(var/fanny in typesof(/obj/item/weapon/storage/belt/fannypack))
|
||||
var/obj/item/weapon/storage/belt/fannypack/fanny_type = fanny
|
||||
fannys[initial(fanny_type.name)] = fanny_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(fannys))
|
||||
|
||||
/datum/gear/accessory/webbing
|
||||
display_name = "webbing, simple"
|
||||
path = /obj/item/clothing/accessory/storage/webbing
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | PHORONGUARD
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
|
||||
phoronproof = 1
|
||||
slowdown = 2
|
||||
armor = list(melee = 60, bullet = 50, laser = 40,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0.2
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
|
||||
@@ -49,6 +49,9 @@
|
||||
item_flags = THICKMATERIAL
|
||||
siemens_coefficient = 0.2
|
||||
phoronproof = 1
|
||||
offline_slowdown = 5
|
||||
slowdown = 2
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
|
||||
|
||||
air_type = /obj/item/weapon/tank/vox
|
||||
|
||||
@@ -108,7 +111,6 @@
|
||||
icon_state = "voxstealth_rig"
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 100)
|
||||
emp_protection = 40 //change this to 30 if too high.
|
||||
slowdown = 0
|
||||
phoronproof = 1
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
icon_state = "webbing-vox"
|
||||
slot = "vox"
|
||||
|
||||
slots = 5
|
||||
slots = 3
|
||||
|
||||
/obj/item/clothing/accessory/storage/vox/New()
|
||||
..()
|
||||
|
||||
@@ -5,12 +5,9 @@
|
||||
var/chaotic = 0 // A number showing how chaotic the action may be. If danger is high, the GM will avoid it.
|
||||
var/reusable = FALSE // If true, the event does not become disabled upon being used. Should be used sparingly.
|
||||
var/observers_used = FALSE // Determines if the GM should check if ghosts are available before using this.
|
||||
var/length = 0 // Determines how long the event lasts, until end() is called.
|
||||
var/datum/game_master/gm = null
|
||||
|
||||
/datum/gm_action/New(var/datum/game_master/new_gm)
|
||||
..()
|
||||
gm = new_gm
|
||||
|
||||
/datum/gm_action/proc/set_up()
|
||||
return
|
||||
|
||||
|
||||
65
code/modules/gamemaster/actions/carp_migration.dm
Normal file
65
code/modules/gamemaster/actions/carp_migration.dm
Normal file
@@ -0,0 +1,65 @@
|
||||
//carp_migration
|
||||
/datum/gm_action/carp_migration
|
||||
name = "carp migration"
|
||||
departments = list(ROLE_SECURITY, ROLE_EVERYONE)
|
||||
chaotic = 50
|
||||
var/list/spawned_carp = list()
|
||||
var/carp_amount = 0
|
||||
length = 20 MINUTES
|
||||
|
||||
/datum/gm_action/carp_migration/get_weight()
|
||||
var/people_in_space = 0
|
||||
for(var/mob/living/L in player_list)
|
||||
if(!(L.z in config.station_levels))
|
||||
continue // Not on the right z-level.
|
||||
var/turf/T = get_turf(L)
|
||||
if(istype(T, /turf/space) && istype(T.loc,/area/space))
|
||||
people_in_space++
|
||||
return 50 + (metric.count_people_in_department(ROLE_SECURITY) * 10) + (people_in_space * 20)
|
||||
|
||||
/datum/gm_action/carp_migration/announce()
|
||||
var/announcement = "Unknown biological entities have been detected near [station_name()], please stand-by."
|
||||
command_announcement.Announce(announcement, "Lifesign Alert")
|
||||
|
||||
/datum/gm_action/carp_migration/set_up()
|
||||
// Higher filled roles means more groups of fish.
|
||||
var/station_strength = 0
|
||||
station_strength += (metric.count_people_in_department(ROLE_SECURITY) * 3)
|
||||
station_strength += (metric.count_people_in_department(ROLE_ENGINEERING) * 2)
|
||||
station_strength += metric.count_people_in_department(ROLE_MEDICAL)
|
||||
|
||||
// Less active emergency response departments tones the event down.
|
||||
var/activeness = ((metric.assess_department(ROLE_SECURITY) + metric.assess_department(ROLE_ENGINEERING) + metric.assess_department(ROLE_MEDICAL)) / 3)
|
||||
activeness = max(activeness, 20)
|
||||
|
||||
carp_amount = Ceiling(station_strength * (activeness / 100) + 1)
|
||||
|
||||
/datum/gm_action/carp_migration/start()
|
||||
..()
|
||||
var/list/spawn_locations = list()
|
||||
|
||||
var/group_size_min = 3
|
||||
var/group_size_max = 5
|
||||
|
||||
for(var/obj/effect/landmark/C in landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
spawn_locations.Add(C.loc)
|
||||
|
||||
spawn_locations = shuffle(spawn_locations)
|
||||
carp_amount = min(carp_amount, spawn_locations.len)
|
||||
|
||||
var/i = 1
|
||||
while (i <= carp_amount)
|
||||
var/group_size = rand(group_size_min, group_size_max)
|
||||
for (var/j = 1, j <= group_size, j++)
|
||||
spawned_carp.Add(new /mob/living/simple_animal/hostile/carp(spawn_locations[i]))
|
||||
i++
|
||||
message_admins("[spawned_carp.len] carp spawned by event.")
|
||||
|
||||
/datum/gm_action/carp_migration/end()
|
||||
for(var/mob/living/simple_animal/hostile/carp/C in spawned_carp)
|
||||
if(!C.stat)
|
||||
var/turf/T = get_turf(C)
|
||||
if(istype(T, /turf/space))
|
||||
if(!prob(25))
|
||||
qdel(C)
|
||||
@@ -1,9 +1,21 @@
|
||||
// Comms blackout is, just like grid check, mostly the same as always, yet engineering has an option to get it back sooner.
|
||||
|
||||
/datum/gm_action/comms_blackout
|
||||
name = "communications blackout"
|
||||
departments = list(ROLE_ENGINEERING, ROLE_EVERYONE)
|
||||
chaotic = 35
|
||||
|
||||
/datum/gm_action/comms_blackout/get_weight()
|
||||
return 50 + (metric.count_people_in_department(ROLE_ENGINEERING) * 40)
|
||||
return 50 + (metric.count_people_in_department(ROLE_ENGINEERING) * 40)
|
||||
|
||||
/datum/gm_action/comms_blackout/announce()
|
||||
if(prob(33))
|
||||
command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg')
|
||||
// AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
A << "<br>"
|
||||
A << "<span class='warning'><b>Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT</b></span>"
|
||||
A << "<br>"
|
||||
|
||||
/datum/gm_action/comms_blackout/start()
|
||||
..()
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
T.emp_act(1)
|
||||
|
||||
17
code/modules/gamemaster/actions/dust.dm
Normal file
17
code/modules/gamemaster/actions/dust.dm
Normal file
@@ -0,0 +1,17 @@
|
||||
/datum/gm_action/dust
|
||||
name = "dust"
|
||||
departments = list(ROLE_ENGINEERING)
|
||||
chaotic = 10
|
||||
reusable = TRUE
|
||||
|
||||
/datum/gm_action/dust/announce()
|
||||
command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching your colony.", "Dust Alert")
|
||||
|
||||
/datum/gm_action/dust/get_weight()
|
||||
var/engineers = metric.count_people_in_department(ROLE_ENGINEERING)
|
||||
var/weight = 30 + (engineers * 25)
|
||||
return weight
|
||||
|
||||
/datum/gm_action/dust/start()
|
||||
..()
|
||||
dust_swarm("norm")
|
||||
@@ -13,6 +13,7 @@
|
||||
return 50 + (metric.count_people_in_department(ROLE_ENGINEERING) * 30)
|
||||
|
||||
/datum/gm_action/grid_check/start()
|
||||
..()
|
||||
// This sets off a chain of events that lead to the actual grid check (or perhaps worse).
|
||||
// First, the Supermatter engine makes a power spike.
|
||||
for(var/obj/machinery/power/generator/engine in machines)
|
||||
|
||||
51
code/modules/gamemaster/actions/meteor_defense.dm
Normal file
51
code/modules/gamemaster/actions/meteor_defense.dm
Normal file
@@ -0,0 +1,51 @@
|
||||
// This event gives the station an advance warning about meteors, so that they can prepare in various ways.
|
||||
|
||||
/datum/gm_action/meteor_defense
|
||||
name = "meteor defense"
|
||||
departments = list(ROLE_ENGINEERING)
|
||||
chaotic = 50
|
||||
var/direction = null
|
||||
var/dir_text = null
|
||||
var/waves = 0
|
||||
|
||||
/datum/gm_action/meteor_defense/get_weight()
|
||||
var/engineers = metric.count_people_in_department(ROLE_ENGINEERING)
|
||||
var/weight = (max(engineers - 1, 0) * 25) // If only one engineer exists, no meteors for now.
|
||||
return weight
|
||||
|
||||
/datum/gm_action/meteor_defense/set_up()
|
||||
direction = pick(cardinal) // alldirs doesn't work with current meteor code unfortunately.
|
||||
waves = rand(5, 8)
|
||||
switch(direction)
|
||||
if(NORTH)
|
||||
dir_text = "aft" // For some reason this is needed.
|
||||
if(SOUTH)
|
||||
dir_text = "fore"
|
||||
if(EAST)
|
||||
dir_text = "port"
|
||||
if(WEST)
|
||||
dir_text = "starboard"
|
||||
|
||||
/datum/gm_action/meteor_defense/announce()
|
||||
var/announcement = "Alert! Two other asteroids have collided near [station_name()]. Chunks of it are expected to approach from the [dir_text] side. ETA to arrival is \
|
||||
approximately 10 minutes."
|
||||
command_announcement.Announce(announcement, "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
|
||||
/datum/gm_action/meteor_defense/start()
|
||||
..()
|
||||
spawn(0)
|
||||
// sleep(5 MINUTES)
|
||||
var/announcement = "The incoming debris are expected to approach from the [dir_text] side. ETA to arrival is approximately 5 minutes."
|
||||
command_announcement.Announce(announcement, "Meteor Alert - Update")
|
||||
// sleep(5 MINUTES)
|
||||
announcement = "Incoming debris approaches from the [dir_text] side!"
|
||||
command_announcement.Announce(announcement, "Meteor Alert - Update")
|
||||
while(waves)
|
||||
message_admins("[waves] more wave\s of meteors remain.")
|
||||
spawn(1) // Dir is reversed because the direction describes where meteors are going, not what side it's gonna hit.
|
||||
spawn_meteors(rand(8, 12), meteors_threatening, reverse_dir[direction])
|
||||
waves--
|
||||
sleep(30 SECONDS)
|
||||
announcement = "The colony has cleared the incoming debris."
|
||||
command_announcement.Announce(announcement, "Meteor Alert - Update")
|
||||
message_admins("Meteor defense event has ended.")
|
||||
17
code/modules/gamemaster/actions/shipping_error.dm
Normal file
17
code/modules/gamemaster/actions/shipping_error.dm
Normal file
@@ -0,0 +1,17 @@
|
||||
/datum/gm_action/shipping_error
|
||||
name = "shipping error"
|
||||
departments = list(ROLE_CARGO)
|
||||
reusable = TRUE
|
||||
|
||||
/datum/gm_action/shipping_error/get_weight()
|
||||
var/cargo = metric.count_people_in_department(ROLE_CARGO)
|
||||
var/weight = (cargo * 40)
|
||||
return weight
|
||||
|
||||
/datum/gm_action/shipping_error/start()
|
||||
..()
|
||||
var/datum/supply_order/O = new /datum/supply_order()
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
|
||||
supply_controller.shoppinglist += O
|
||||
53
code/modules/gamemaster/actions/surprise_carp_attack.dm
Normal file
53
code/modules/gamemaster/actions/surprise_carp_attack.dm
Normal file
@@ -0,0 +1,53 @@
|
||||
// This event sends a few carp after someone in space.
|
||||
|
||||
/datum/gm_action/surprise_carp_attack
|
||||
name = "surprise carp attack"
|
||||
departments = list(ROLE_EVERYONE)
|
||||
reusable = TRUE
|
||||
chaotic = 10
|
||||
var/mob/living/victim = null
|
||||
|
||||
/datum/gm_action/surprise_carp_attack/get_weight()
|
||||
var/people_in_space = 0
|
||||
for(var/mob/living/L in player_list)
|
||||
if(!(L.z in config.station_levels))
|
||||
continue // Not on the right z-level.
|
||||
var/turf/T = get_turf(L)
|
||||
if(istype(T, /turf/space) && istype(T.loc,/area/space))
|
||||
people_in_space++
|
||||
return people_in_space * 50
|
||||
|
||||
/datum/gm_action/surprise_carp_attack/set_up()
|
||||
var/list/potential_victims = list()
|
||||
victim = null
|
||||
for(var/mob/living/L in player_list)
|
||||
if(!(L.z in config.station_levels))
|
||||
continue // Not on the right z-level.
|
||||
if(L.stat)
|
||||
continue // Don't want dead people.
|
||||
var/turf/T = get_turf(L)
|
||||
if(istype(T, /turf/space) && istype(T.loc,/area/space))
|
||||
potential_victims.Add(L)
|
||||
victim = pick(potential_victims)
|
||||
|
||||
|
||||
/datum/gm_action/surprise_carp_attack/start()
|
||||
..()
|
||||
if(!victim)
|
||||
message_admins("Surprise carp attack failed to find a target.")
|
||||
return
|
||||
var/number_of_carp = rand(1, 2)
|
||||
message_admins("Sending [number_of_carp] carp\s after [victim].")
|
||||
while(number_of_carp)
|
||||
var/turf/spawning_turf = null
|
||||
var/list/nearby_things = oview(10, victim)
|
||||
for(var/turf/space/space in nearby_things)
|
||||
if(get_dist(space, victim) <= 7)
|
||||
continue
|
||||
spawning_turf = space
|
||||
break
|
||||
if(spawning_turf)
|
||||
var/mob/living/simple_animal/hostile/carp/C = new(spawning_turf)
|
||||
C.target_mob = victim
|
||||
C.stance = STANCE_ATTACK
|
||||
number_of_carp--
|
||||
17
code/modules/gamemaster/actions/surprise_meteor.dm
Normal file
17
code/modules/gamemaster/actions/surprise_meteor.dm
Normal file
@@ -0,0 +1,17 @@
|
||||
// This event sends one wave of meteors unannounced.
|
||||
|
||||
/datum/gm_action/surprise_meteors
|
||||
name = "surprise meteors"
|
||||
departments = list(ROLE_ENGINEERING)
|
||||
chaotic = 25
|
||||
|
||||
/datum/gm_action/surprise_meteors/get_weight()
|
||||
var/engineers = metric.count_people_in_department(ROLE_ENGINEERING)
|
||||
var/weight = (max(engineers - 1, 0) * 25) // If only one engineer exists, no meteors for now.
|
||||
return weight
|
||||
|
||||
/datum/gm_action/surprise_meteors/start()
|
||||
..()
|
||||
spawn(1)
|
||||
spawn_meteors(rand(4, 8), meteors_normal, pick(cardinal))
|
||||
message_admins("Surprise meteors event has ended.")
|
||||
@@ -24,7 +24,7 @@
|
||||
for(var/datum/gm_action/action in available_actions)
|
||||
if(action.enabled == FALSE)
|
||||
continue
|
||||
HTML += "[action.name] ([english_list(action.departments)]) (weight: [action.get_weight()])<br>"
|
||||
HTML += "[action.name] ([english_list(action.departments)]) (weight: [action.get_weight()]) <a href='?src=\ref[action];force=1'>\[Force\]</a> <br>"
|
||||
|
||||
HTML += "<br>"
|
||||
HTML += "All living mobs activity: [metric.assess_all_living_mobs()]%<br>"
|
||||
@@ -77,4 +77,16 @@
|
||||
adjust_danger(amount)
|
||||
message_admins("GM danger was adjusted by [amount] by [usr.key].")
|
||||
|
||||
interact(usr) // To refresh the UI.
|
||||
interact(usr) // To refresh the UI.
|
||||
|
||||
/datum/gm_action/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(!is_admin(usr))
|
||||
message_admins("[usr] has attempted to force an event without being an admin.")
|
||||
return
|
||||
|
||||
if(href_list["force"])
|
||||
gm.run_action(src)
|
||||
message_admins("GM event [name] was forced by [usr.key].")
|
||||
@@ -19,6 +19,8 @@
|
||||
/datum/game_master/New()
|
||||
..()
|
||||
available_actions = init_subtypes(/datum/gm_action)
|
||||
for(var/datum/gm_action/action in available_actions)
|
||||
action.gm = src
|
||||
|
||||
/datum/game_master/proc/process()
|
||||
if(ticker && ticker.current_state == GAME_STATE_PLAYING && !suspended)
|
||||
@@ -68,17 +70,26 @@
|
||||
if(best_actions && best_actions.len)
|
||||
var/list/weighted_actions = list()
|
||||
for(var/datum/gm_action/action in best_actions)
|
||||
if(action.chaotic > danger)
|
||||
continue // We skip dangerous events when bad stuff is already occuring.
|
||||
weighted_actions[action] = action.get_weight()
|
||||
|
||||
var/datum/gm_action/choice = pickweight(weighted_actions)
|
||||
if(choice)
|
||||
log_debug("[choice.name] was chosen by the Game Master, and is now being ran.")
|
||||
choice.set_up()
|
||||
choice.start()
|
||||
next_action = world.time + rand(15 MINUTES, 30 MINUTES)
|
||||
last_department_used = choice.departments[1]
|
||||
|
||||
run_action(choice)
|
||||
|
||||
/datum/game_master/proc/run_action(var/datum/gm_action/action)
|
||||
action.set_up()
|
||||
action.start()
|
||||
action.announce()
|
||||
if(action.chaotic)
|
||||
danger += action.chaotic
|
||||
if(action.length)
|
||||
spawn(action.length)
|
||||
action.end()
|
||||
next_action = world.time + rand(15 MINUTES, 30 MINUTES)
|
||||
last_department_used = action.departments[1]
|
||||
|
||||
|
||||
/datum/game_master/proc/decide_best_action(var/list/most_active_departments)
|
||||
|
||||
@@ -148,11 +148,19 @@
|
||||
return
|
||||
|
||||
user << "<span class='notice'>The crate is locked with a Deca-code lock.</span>"
|
||||
var/input = input(user, "Enter [codelen] digits.", "Deca-Code Lock", "") as text
|
||||
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
var/list/sanitised = list()
|
||||
var/sanitycheck = 1
|
||||
for(var/i=1,i<=length(input),i++) //put the guess into a list
|
||||
sanitised += text2num(copytext(input,i,i+1))
|
||||
for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it
|
||||
for(var/j=(i+1),j<=length(input),j++)
|
||||
if(sanitised[i] == sanitised[j])
|
||||
sanitycheck = null //if a digit is repeated, reject the input
|
||||
|
||||
if(input == null || length(input) != codelen)
|
||||
if(input == null || sanitycheck == null || length(input) != codelen)
|
||||
user << "<span class='notice'>You leave the crate alone.</span>"
|
||||
else if(check_input(input))
|
||||
user << "<span class='notice'>The crate unlocks!</span>"
|
||||
@@ -203,6 +211,9 @@
|
||||
else if(lastattempt[i] in code_contents)
|
||||
++cows
|
||||
code_contents -= lastattempt[i]
|
||||
user << "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>"
|
||||
var/previousattempt = null //convert back to string for readback
|
||||
for(var/i in 1 to codelen)
|
||||
previousattempt = addtext(previousattempt, lastattempt[i])
|
||||
user << "<span class='notice'>Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/list/resource_field = list()
|
||||
|
||||
var/ore_types = list(
|
||||
"iron" = /obj/item/weapon/ore/iron,
|
||||
"hematite" = /obj/item/weapon/ore/iron,
|
||||
"uranium" = /obj/item/weapon/ore/uranium,
|
||||
"gold" = /obj/item/weapon/ore/gold,
|
||||
"silver" = /obj/item/weapon/ore/silver,
|
||||
@@ -26,7 +26,7 @@
|
||||
"osmium" = /obj/item/weapon/ore/osmium,
|
||||
"hydrogen" = /obj/item/weapon/ore/hydrogen,
|
||||
"silicates" = /obj/item/weapon/ore/glass,
|
||||
"carbonaceous rock" = /obj/item/weapon/ore/coal
|
||||
"carbon" = /obj/item/weapon/ore/coal
|
||||
)
|
||||
|
||||
//Upgrades
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
var/ore_type
|
||||
|
||||
switch(metal)
|
||||
if("silicates", "carbonaceous rock", "iron") ore_type = "surface minerals"
|
||||
if("silicates", "carbon", "hematite") ore_type = "surface minerals"
|
||||
if("gold", "silver", "diamond") ore_type = "precious metals"
|
||||
if("uranium") ore_type = "nuclear fuel"
|
||||
if("phoron", "osmium", "hydrogen") ore_type = "exotic matter"
|
||||
|
||||
@@ -175,9 +175,8 @@ var/list/mining_overlay_cache = list()
|
||||
|
||||
if(severity <= 2) // Now to expose the ore lying under the sand.
|
||||
spawn(1) // Otherwise most of the ore is lost to the explosion, which makes this rather moot.
|
||||
var/losses = rand(0.5, 1) // Between 0% to 50% loss due to booms.
|
||||
for(var/ore in resources)
|
||||
var/amount_to_give = Ceiling(resources[ore] * losses) // Should result in at least one piece of ore.
|
||||
var/amount_to_give = rand(Ceiling(resources[ore]/2), resources[ore]) // Should result in at least one piece of ore.
|
||||
for(var/i=1, i <= amount_to_give, i++)
|
||||
var/oretype = ore_types[ore]
|
||||
new oretype(src)
|
||||
|
||||
@@ -708,6 +708,10 @@
|
||||
icon_state = module_sprites[icontype]
|
||||
return
|
||||
|
||||
if(typing)
|
||||
typing = FALSE
|
||||
set_typing_indicator(1)
|
||||
|
||||
/mob/living/silicon/robot/proc/installed_modules()
|
||||
if(weapon_lock)
|
||||
src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
cold_damage_per_tick = 20
|
||||
var/poison_per_bite = 5
|
||||
var/poison_chance = 10
|
||||
var/poison_type = "toxin"
|
||||
var/poison_type = "spidertoxin"
|
||||
faction = "spiders"
|
||||
var/busy = 0
|
||||
pass_flags = PASSTABLE
|
||||
@@ -85,9 +85,14 @@
|
||||
if(prob(5))
|
||||
var/obj/item/organ/external/O = pick(H.organs)
|
||||
if(!(O.robotic >= ORGAN_ROBOT))
|
||||
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/, list(O, src))
|
||||
O.implants += eggs
|
||||
H << "<span class='warning'>The [src] injects something into your [O.name]!</span>"
|
||||
var/eggcount
|
||||
for(var/obj/I in O.implants)
|
||||
if(istype(I, /obj/effect/spider/eggcluster))
|
||||
eggcount ++
|
||||
if(!eggcount)
|
||||
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src))
|
||||
O.implants += eggs
|
||||
H << "<span class='warning'>The [src] injects something into your [O.name]!</span>"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/Life()
|
||||
..()
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
if(!M.restrained() && !M.stat)
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
M.u_equip(src)
|
||||
M.unEquip(src)
|
||||
M.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
M.u_equip(src)
|
||||
M.unEquip(src)
|
||||
M.put_in_l_hand(src)
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
|
||||
|
||||
/obj/machinery/photocopier/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/motor(src)
|
||||
|
||||
@@ -98,10 +98,10 @@ var/global/photo_count = 0
|
||||
if((!( M.restrained() ) && !( M.stat ) && M.back == src))
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
M.u_equip(src)
|
||||
M.unEquip(src)
|
||||
M.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
M.u_equip(src)
|
||||
M.unEquip(src)
|
||||
M.put_in_l_hand(src)
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
@@ -701,6 +701,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(H.species.can_shred(H))
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.visible_message("<span call='warning'>[user.name] slashes at the [src.name]!</span>", "<span class='notice'>You slash at the [src.name]!</span>")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
|
||||
@@ -535,6 +535,7 @@
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.can_shred(H))
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message("\red [user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
|
||||
broken()
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
icon_state = "darkcannon"
|
||||
item_state = "darkcannon"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
charge_cost = 600
|
||||
projectile_type = /obj/item/projectile/beam/darkmatter
|
||||
self_recharge = 1
|
||||
@@ -102,6 +103,7 @@
|
||||
icon_state = "noise"
|
||||
item_state = "noise"
|
||||
fire_sound = 'sound/effects/basscannon.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
self_recharge = 1
|
||||
charge_cost = 600
|
||||
|
||||
|
||||
@@ -107,8 +107,10 @@ obj/aiming_overlay/proc/update_aiming_deferred()
|
||||
cancel_aiming()
|
||||
return
|
||||
|
||||
if(!locked && lock_time >= world.time)
|
||||
if(!locked && lock_time <= world.time)
|
||||
locked = 1
|
||||
owner << "<span class ='notice'>You are locked onto your target.</span>"
|
||||
aiming_at << "<span class='danger'>The gun is trained on you!</span>"
|
||||
update_icon()
|
||||
|
||||
var/cancel_aim = 1
|
||||
@@ -176,7 +178,7 @@ obj/aiming_overlay/proc/update_aiming_deferred()
|
||||
toggle_active(1)
|
||||
locked = 0
|
||||
update_icon()
|
||||
lock_time = world.time + 35
|
||||
lock_time = world.time + 25
|
||||
|
||||
/obj/aiming_overlay/update_icon()
|
||||
if(locked)
|
||||
|
||||
@@ -27,3 +27,5 @@
|
||||
var/obj/item/weapon/gun/G = aiming_with
|
||||
if(istype(G))
|
||||
G.Fire(aiming_at, owner, reflex = 1)
|
||||
locked = 0
|
||||
lock_time = world.time+10
|
||||
|
||||
@@ -49,11 +49,11 @@
|
||||
if(!priority_process) sleep(-1)
|
||||
T.resources = list()
|
||||
T.resources["silicates"] = rand(3,5)
|
||||
T.resources["carbonaceous rock"] = rand(3,5)
|
||||
T.resources["carbon"] = rand(3,5)
|
||||
|
||||
var/current_cell = map[get_map_cell(x,y)]
|
||||
if(current_cell < rare_val) // Surface metals.
|
||||
T.resources["iron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
|
||||
T.resources["hematite"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
|
||||
T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
|
||||
T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
|
||||
T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
|
||||
@@ -69,14 +69,14 @@
|
||||
T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
|
||||
T.resources["hydrogen"] = 0
|
||||
T.resources["diamond"] = 0
|
||||
T.resources["iron"] = 0
|
||||
T.resources["hematite"] = 0
|
||||
else // Deep metals.
|
||||
T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
|
||||
T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
|
||||
T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
|
||||
T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
|
||||
T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
|
||||
T.resources["iron"] = 0
|
||||
T.resources["hematite"] = 0
|
||||
T.resources["gold"] = 0
|
||||
T.resources["silver"] = 0
|
||||
return
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
return
|
||||
|
||||
else
|
||||
trans = reagents.splash(target, amount_per_transfer_from_this, max_spill=30) //sprinkling reagents on generic non-mobs
|
||||
trans = reagents.splash(target, amount_per_transfer_from_this, max_spill=0) //sprinkling reagents on generic non-mobs
|
||||
user << "<span class='notice'>You transfer [trans] units of the solution.</span>"
|
||||
|
||||
else // Taking from something
|
||||
|
||||
@@ -131,23 +131,28 @@
|
||||
..()
|
||||
reagents.add_reagent("soymilk", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallmilk
|
||||
name = "small milk carton"
|
||||
desc = "It's milk. White and nutritious goodness!"
|
||||
volume = 30
|
||||
icon_state = "mini-milk"
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/New()
|
||||
item_state = "carton"
|
||||
center_of_mass = list("x"=16, "y"=9)
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallmilk/New()
|
||||
..()
|
||||
reagents.add_reagent("milk", 30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk
|
||||
name = "small chocolate milk carton"
|
||||
desc = "It's milk! This one is in delicious chocolate flavour."
|
||||
volume = 30
|
||||
icon_state = "mini-milk_choco"
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate/New()
|
||||
item_state = "carton"
|
||||
center_of_mass = list("x"=16, "y"=9)
|
||||
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk/New()
|
||||
..()
|
||||
reagents.add_reagent("chocolate_milk", 30)
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/coffee
|
||||
name = "\improper Robust Coffee"
|
||||
desc = "Careful, the beverage you're about to enjoy is extremely hot."
|
||||
|
||||
@@ -22,16 +22,16 @@
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/breadslice))
|
||||
sandwich_limit += 4
|
||||
|
||||
if(src.contents.len > sandwich_limit)
|
||||
user << "\red If you put anything else on \the [src] it's going to collapse."
|
||||
return
|
||||
else if(istype(W,/obj/item/weapon/material/shard))
|
||||
if(istype(W,/obj/item/weapon/material/shard))
|
||||
user << "\blue You hide [W] in \the [src]."
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
update()
|
||||
return
|
||||
else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks))
|
||||
if(src.contents.len > sandwich_limit)
|
||||
user << "\red If you put anything else on \the [src] it's going to collapse."
|
||||
return
|
||||
user << "\blue You layer [W] over \the [src]."
|
||||
var/obj/item/weapon/reagent_containers/F = W
|
||||
F.reagents.trans_to_obj(src, F.reagents.total_volume)
|
||||
|
||||
36
html/changelogs/Anewbe - Announcement.yml
Normal file
36
html/changelogs/Anewbe - Announcement.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Anewbe
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "Fake command reports now make the paper show up."
|
||||
36
html/changelogs/Anewbe - Mining Cameras.yml
Normal file
36
html/changelogs/Anewbe - Mining Cameras.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Anewbe
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- bugfix: "Mining cameras should work now."
|
||||
36
html/changelogs/MagmaRam - Aimbot.yml
Normal file
36
html/changelogs/MagmaRam - Aimbot.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: MagmaRam
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- tweak: "There is now a short delay before being able to fire when using hostage-taking mode, and a short delay between shots. This should make hostage mode useful for taking hostages and ambushes, rather than as an aimbot in actual firefights."
|
||||
36
html/changelogs/MagmaRam - Sandwich.yml
Normal file
36
html/changelogs/MagmaRam - Sandwich.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: MagmaRam
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- bugfix: "Sandwiches at max size can be eaten with a fork."
|
||||
36
html/changelogs/zuhayr-dibs.yml
Normal file
36
html/changelogs/zuhayr-dibs.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Zuhayr
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "Adminhelps now have a TAKE button that allow an admin to claim it, and inform the adminhelper that someone is on the case."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 83 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -1428,8 +1428,14 @@
|
||||
#include "code\modules\gamemaster\game_master.dm"
|
||||
#include "code\modules\gamemaster\helpers.dm"
|
||||
#include "code\modules\gamemaster\actions\action.dm"
|
||||
#include "code\modules\gamemaster\actions\carp_migration.dm"
|
||||
#include "code\modules\gamemaster\actions\comms_blackout.dm"
|
||||
#include "code\modules\gamemaster\actions\dust.dm"
|
||||
#include "code\modules\gamemaster\actions\grid_check.dm"
|
||||
#include "code\modules\gamemaster\actions\meteor_defense.dm"
|
||||
#include "code\modules\gamemaster\actions\shipping_error.dm"
|
||||
#include "code\modules\gamemaster\actions\surprise_carp_attack.dm"
|
||||
#include "code\modules\gamemaster\actions\surprise_meteor.dm"
|
||||
#include "code\modules\gamemaster\actions\waste_disposal.dm"
|
||||
#include "code\modules\games\cah.dm"
|
||||
#include "code\modules\games\cah_black_cards.dm"
|
||||
|
||||
Reference in New Issue
Block a user