diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm index 58baa14e8e..d97e15b7ee 100644 --- a/code/datums/uplink/announcements.dm +++ b/code/datums/uplink/announcements.dm @@ -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", "
") + 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 diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index f4d92e4261..f3cc85f685 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -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() ..() diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index ae77e8f216..a841e15476 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -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 diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index f91191fac5..9658cc0a81 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -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 \ diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 3bf4299cd2..8e273f9adb 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -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 diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 5efd83bb92..c503a5d4bd 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -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" diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7c46651419..f30e3b4cfb 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -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("\The [user] slashes at [src]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) add_hiddenprint(user) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index e6577f3097..de81fbb0fa 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -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) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 03d3c1170f..9e34252ebd 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -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" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ecd20ae76e..bf384a401e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -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) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 2ac0c2a48d..13352a1645 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -160,6 +160,8 @@ if(H.species.can_shred(H)) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("[user] smashes against the [src.name].", 1) + user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) take_damage(25) return return src.attackby(user, user) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 6f2ea5129d..64fc0c4a8f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -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, diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b742b8a14b..09ff0075db 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -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 << "You slash at the armored suit!" diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b7b258f5d6..1077d757ae 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -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." diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm index c46c519e9e..fc981a9e8c 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm @@ -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 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 49d0238c13..06fd49d0e3 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -285,4 +285,59 @@ /obj/item/weapon/anobattery, /obj/item/device/ano_scanner, /obj/item/weapon/pickaxe/hand - ) \ No newline at end of file + ) + +/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" + diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 5845bd7c31..5457c860e5 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -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 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 8c1c47713a..3846a44d2b 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -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) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index b5444ec6c7..c42c65654d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1245,7 +1245,7 @@ proc/admin_notice(var/message, var/rights) M = whom C = M.client else - return "(*not an mob*)" + return "(*not a mob*)" switch(detail) if(0) return "[key_name(C, link, name, highlight_special)]" @@ -1255,15 +1255,15 @@ proc/admin_notice(var/message, var/rights) if(2) //Admins var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)" + return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA) (TAKE)" if(3) //Devs var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](VV)([admin_jump_link(M, src)])" + return "[key_name(C, link, name, highlight_special)](VV)([admin_jump_link(M, src)]) (TAKE)" if(4) //Mentors var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(M, src)])" + return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (TAKE)" /proc/ishost(whom) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index fe427b54d8..a545bc1e87 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -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 = "ADMINHELP: [key_name(usr.client)] is attending to [key_name(M)]'s adminhelp, please don't dogpile them." + for(var/client/X in admins) + if((R_ADMIN|R_MOD|R_MENTOR) & X.holder.rights) + to_chat(X, take_msg) + to_chat(M, "Your adminhelp is being attended to by [usr.client]. Thanks for your patience!") + else + to_chat(usr, "Unable to locate mob.") + else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN|R_SERVER|R_MOD)) return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 4a261a3d98..169ab9b6a0 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -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 diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 3441962ef0..a7472c388f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 43a19c558f..996387aa1d 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index d34739cad3..5d73e804b2 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -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) diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm index b29df92e8c..bd66830f6e 100644 --- a/code/modules/clothing/under/xenos/vox.dm +++ b/code/modules/clothing/under/xenos/vox.dm @@ -25,7 +25,7 @@ icon_state = "webbing-vox" slot = "vox" - slots = 5 + slots = 3 /obj/item/clothing/accessory/storage/vox/New() ..() diff --git a/code/modules/gamemaster/actions/action.dm b/code/modules/gamemaster/actions/action.dm index 82ebd860b5..aa259ccc03 100644 --- a/code/modules/gamemaster/actions/action.dm +++ b/code/modules/gamemaster/actions/action.dm @@ -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 diff --git a/code/modules/gamemaster/actions/carp_migration.dm b/code/modules/gamemaster/actions/carp_migration.dm new file mode 100644 index 0000000000..520eb0c314 --- /dev/null +++ b/code/modules/gamemaster/actions/carp_migration.dm @@ -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) \ No newline at end of file diff --git a/code/modules/gamemaster/actions/comms_blackout.dm b/code/modules/gamemaster/actions/comms_blackout.dm index 75359085ac..71b172b153 100644 --- a/code/modules/gamemaster/actions/comms_blackout.dm +++ b/code/modules/gamemaster/actions/comms_blackout.dm @@ -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) \ No newline at end of file + 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 << "
" + A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT" + A << "
" + +/datum/gm_action/comms_blackout/start() + ..() + for(var/obj/machinery/telecomms/T in telecomms_list) + T.emp_act(1) diff --git a/code/modules/gamemaster/actions/dust.dm b/code/modules/gamemaster/actions/dust.dm new file mode 100644 index 0000000000..caecc51445 --- /dev/null +++ b/code/modules/gamemaster/actions/dust.dm @@ -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") \ No newline at end of file diff --git a/code/modules/gamemaster/actions/grid_check.dm b/code/modules/gamemaster/actions/grid_check.dm index 08c817fdf9..dcf35a230f 100644 --- a/code/modules/gamemaster/actions/grid_check.dm +++ b/code/modules/gamemaster/actions/grid_check.dm @@ -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) diff --git a/code/modules/gamemaster/actions/meteor_defense.dm b/code/modules/gamemaster/actions/meteor_defense.dm new file mode 100644 index 0000000000..1bae723b00 --- /dev/null +++ b/code/modules/gamemaster/actions/meteor_defense.dm @@ -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.") \ No newline at end of file diff --git a/code/modules/gamemaster/actions/shipping_error.dm b/code/modules/gamemaster/actions/shipping_error.dm new file mode 100644 index 0000000000..affbe94dc9 --- /dev/null +++ b/code/modules/gamemaster/actions/shipping_error.dm @@ -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 \ No newline at end of file diff --git a/code/modules/gamemaster/actions/surprise_carp_attack.dm b/code/modules/gamemaster/actions/surprise_carp_attack.dm new file mode 100644 index 0000000000..c91103c878 --- /dev/null +++ b/code/modules/gamemaster/actions/surprise_carp_attack.dm @@ -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-- \ No newline at end of file diff --git a/code/modules/gamemaster/actions/surprise_meteor.dm b/code/modules/gamemaster/actions/surprise_meteor.dm new file mode 100644 index 0000000000..682a8287a6 --- /dev/null +++ b/code/modules/gamemaster/actions/surprise_meteor.dm @@ -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.") \ No newline at end of file diff --git a/code/modules/gamemaster/controller.dm b/code/modules/gamemaster/controller.dm index 079c535164..343f05842d 100644 --- a/code/modules/gamemaster/controller.dm +++ b/code/modules/gamemaster/controller.dm @@ -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()])
" + HTML += "[action.name] ([english_list(action.departments)]) (weight: [action.get_weight()]) \[Force\]
" HTML += "
" HTML += "All living mobs activity: [metric.assess_all_living_mobs()]%
" @@ -77,4 +77,16 @@ adjust_danger(amount) message_admins("GM danger was adjusted by [amount] by [usr.key].") - interact(usr) // To refresh the UI. \ No newline at end of file + 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].") \ No newline at end of file diff --git a/code/modules/gamemaster/game_master.dm b/code/modules/gamemaster/game_master.dm index 180892f4c9..c435e868f6 100644 --- a/code/modules/gamemaster/game_master.dm +++ b/code/modules/gamemaster/game_master.dm @@ -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) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 9585a4965b..a017476af3 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -148,11 +148,19 @@ return user << "The crate is locked with a Deca-code lock." - 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 << "You leave the crate alone." else if(check_input(input)) user << "The crate unlocks!" @@ -203,6 +211,9 @@ else if(lastattempt[i] in code_contents) ++cows code_contents -= lastattempt[i] - user << "Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." + var/previousattempt = null //convert back to string for readback + for(var/i in 1 to codelen) + previousattempt = addtext(previousattempt, lastattempt[i]) + user << "Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." return ..() diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 31d99ebb05..5b1cbe496f 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -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 diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index c0c3dd937d..4a8c3c59b6 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -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" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index b9fc47e4e9..f46d384f86 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -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) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index db412c4134..5aef9abd4b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -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]" diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 030f9b8e6b..52704d85cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -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 << "The [src] injects something into your [O.name]!" + 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 << "The [src] injects something into your [O.name]!" /mob/living/simple_animal/hostile/giant_spider/Life() ..() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ccb527986f..b0da801703 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -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) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 57d10ed227..5373a71781 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -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) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a0f81f0aee..19a7e0498d 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -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 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 036777ca15..184a1731f5 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -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("[user.name] slashes at the [src.name]!", "You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 969cc6b6c2..946d8372ae 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -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() diff --git a/code/modules/projectiles/guns/vox.dm b/code/modules/projectiles/guns/vox.dm index c1e0e84cf8..857b56fa6b 100644 --- a/code/modules/projectiles/guns/vox.dm +++ b/code/modules/projectiles/guns/vox.dm @@ -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 diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 8c87751de7..2dcf0032be 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -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 << "You are locked onto your target." + aiming_at << "The gun is trained on you!" 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) diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm index 2544fae913..188440dcf6 100644 --- a/code/modules/projectiles/targeting/targeting_triggers.dm +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -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 diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 4caacb7099..697a0b416d 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -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 diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index aa952915c3..09897729f9 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -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 << "You transfer [trans] units of the solution." else // Taking from something diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index edb8e7fae6..163fd1161f 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -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." diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index c853706ad5..48356172ca 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -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) diff --git a/html/changelogs/Anewbe - Announcement.yml b/html/changelogs/Anewbe - Announcement.yml new file mode 100644 index 0000000000..1bda432be2 --- /dev/null +++ b/html/changelogs/Anewbe - Announcement.yml @@ -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." diff --git a/html/changelogs/Anewbe - Mining Cameras.yml b/html/changelogs/Anewbe - Mining Cameras.yml new file mode 100644 index 0000000000..2171ac81ed --- /dev/null +++ b/html/changelogs/Anewbe - Mining Cameras.yml @@ -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." \ No newline at end of file diff --git a/html/changelogs/MagmaRam - Aimbot.yml b/html/changelogs/MagmaRam - Aimbot.yml new file mode 100644 index 0000000000..dbe59cb09d --- /dev/null +++ b/html/changelogs/MagmaRam - Aimbot.yml @@ -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." diff --git a/html/changelogs/MagmaRam - Sandwich.yml b/html/changelogs/MagmaRam - Sandwich.yml new file mode 100644 index 0000000000..b9482e6bff --- /dev/null +++ b/html/changelogs/MagmaRam - Sandwich.yml @@ -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." diff --git a/html/changelogs/zuhayr-dibs.yml b/html/changelogs/zuhayr-dibs.yml new file mode 100644 index 0000000000..54cf379ed3 --- /dev/null +++ b/html/changelogs/zuhayr-dibs.yml @@ -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." diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 5bc7760381..c9acba40a4 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 134f719c3a..b26eabc764 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index cf1c7b343c..015a3bc345 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 5e5fa1381e..471dac2fef 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -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"