diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 594cb2d43fa..94da0533b1a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -51,6 +51,65 @@ #define FIRE_LAYER 1 //If you're on fire #define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +//Human Overlay Index Shortcuts for alternate_worn_layer, layers +//Because I *KNOW* somebody will think layer+1 means "above" +//IT DOESN'T OK, IT MEANS "UNDER" +#define UNDER_SPECIES_LAYER SPECIES_LAYER+1 +#define UNDER_BODY_BEHIND_LAYER BODY_BEHIND_LAYER+1 +#define UNDER_BODY_LAYER BODY_LAYER+1 +#define UNDER_BODY_ADJ_LAYER BODY_ADJ_LAYER+1 +#define UNDER_MUTATIONS_LAYER MUTATIONS_LAYER+1 +#define UNDER_AUGMENTS_LAYER AUGMENTS_LAYER+1 +#define UNDER_DAMAGE_LAYER DAMAGE_LAYER+1 +#define UNDER_UNIFORM_LAYER UNIFORM_LAYER+1 +#define UNDER_ID_LAYER ID_LAYER+1 +#define UNDER_SHOES_LAYER SHOES_LAYER+1 +#define UNDER_GLOVES_LAYER GLOVES_LAYER+1 +#define UNDER_EARS_LAYER EARS_LAYER+1 +#define UNDER_SUIT_LAYER SUIT_LAYER+1 +#define UNDER_GLASSES_LAYER GLASSES_LAYER+1 +#define UNDER_BELT_LAYER BELT_LAYER+1 +#define UNDER_SUIT_STORE_LAYER SUIT_STORE_LAYER+1 +#define UNDER_BACK_LAYER BACK_LAYER+1 +#define UNDER_HAIR_LAYER HAIR_LAYER+1 +#define UNDER_FACEMASK_LAYER FACEMASK_LAYER+1 +#define UNDER_HEAD_LAYER HEAD_LAYER+1 +#define UNDER_HANDCUFF_LAYER HANDCUFF_LAYER+1 +#define UNDER_LEGCUFF_LAYER LEGCUFF_LAYER+1 +#define UNDER_L_HAND_LAYER L_HAND_LAYER+1 +#define UNDER_R_HAND_LAYER R_HAND_LAYER+1 +#define UNDER_BODY_FRONT_LAYER BODY_FRONT_LAYER+1 +#define UNDER_FIRE_LAYER FIRE_LAYER+1 + +//AND -1 MEANS "ABOVE", OK?, OK!?! +#define ABOVE_SPECIES_LAYER SPECIES_LAYER-1 +#define ABOVE_BODY_BEHIND_LAYER BODY_BEHIND_LAYER-1 +#define ABOVE_BODY_LAYER BODY_LAYER-1 +#define ABOVE_BODY_ADJ_LAYER BODY_ADJ_LAYER-1 +#define ABOVE_MUTATIONS_LAYER MUTATIONS_LAYER-1 +#define ABOVE_AUGMENTS_LAYER AUGMENTS_LAYER-1 +#define ABOVE_DAMAGE_LAYER DAMAGE_LAYER-1 +#define ABOVE_UNIFORM_LAYER UNIFORM_LAYER-1 +#define ABOVE_ID_LAYER ID_LAYER-1 +#define ABOVE_SHOES_LAYER SHOES_LAYER-1 +#define ABOVE_GLOVES_LAYER GLOVES_LAYER-1 +#define ABOVE_EARS_LAYER EARS_LAYER-1 +#define ABOVE_SUIT_LAYER SUIT_LAYER-1 +#define ABOVE_GLASSES_LAYER GLASSES_LAYER-1 +#define ABOVE_BELT_LAYER BELT_LAYER-1 +#define ABOVE_SUIT_STORE_LAYER SUIT_STORE_LAYER-1 +#define ABOVE_BACK_LAYER BACK_LAYER-1 +#define ABOVE_HAIR_LAYER HAIR_LAYER-1 +#define ABOVE_FACEMASK_LAYER FACEMASK_LAYER-1 +#define ABOVE_HEAD_LAYER HEAD_LAYER-1 +#define ABOVE_HANDCUFF_LAYER HANDCUFF_LAYER-1 +#define ABOVE_LEGCUFF_LAYER LEGCUFF_LAYER-1 +#define ABOVE_L_HAND_LAYER L_HAND_LAYER-1 +#define ABOVE_R_HAND_LAYER R_HAND_LAYER-1 +#define ABOVE_BODY_FRONT_LAYER BODY_FRONT_LAYER-1 +#define ABOVE_FIRE_LAYER FIRE_LAYER-1 + + //Security levels #define SEC_LEVEL_GREEN 0 #define SEC_LEVEL_BLUE 1 diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 7f1b1755d3b..042e8ab3529 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -36,8 +36,6 @@ viruses += DD DD.affected_mob = src DD.holder = src - if(DD.disease_flags & CAN_CARRY && prob(5)) - DD.carrier = 1 //Copy properties over. This is so edited diseases persist. var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm index e1c6bd42951..688637f630f 100644 --- a/code/game/gamemodes/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/abduction/machinery/experiment.dm @@ -137,7 +137,7 @@ if(H.stat == DEAD) say("Specimen deceased - please provide fresh sample.") return "Specimen deceased." - var/obj/item/organ/internal/gland/GlandTest = locate() in H + var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs if(!GlandTest) say("Experimental dissection not detected!") return "No glands detected!" @@ -165,7 +165,7 @@ H << "Objective #[obj_count]: [objective.explanation_text]" obj_count++ - for(var/obj/item/organ/internal/gland/G in H) + for(var/obj/item/organ/internal/gland/G in H.internal_organs) G.Start() point_reward++ if(point_reward > 0) diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index c8e42325e8c..898f558d087 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -37,7 +37,7 @@ ..() if(gang && isnum(gang.dom_timer)) if(gang.dom_timer > 0) - playsound(loc, 'sound/items/timer.ogg', 30, 0) + playsound(loc, 'sound/items/timer.ogg', 10, 0) if(!warned && (gang.dom_timer < 180)) warned = 1 var/area/domloc = get_area(loc) @@ -169,7 +169,7 @@ var/time = round(get_domination_time(tempgang)/60,0.1) if(alert(user,"With [round((tempgang.territory.len/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] minutes.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nYou have [tempgang.dom_attempts] attempt(s) remaining. Are you ready?","Confirm","Ready","Later") == "Ready") - if (!tempgang.dom_attempts || !in_range(src, user) || !istype(src.loc, /turf)) + if (isnum(tempgang.dom_timer) || !tempgang.dom_attempts || !in_range(src, user) || !istype(src.loc, /turf)) return 0 var/area/A = get_area(loc) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index e6174cdf764..9a8b8ab9482 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -172,10 +172,11 @@ var/mob/living/carbon/human/user = usr listclearnulls(ticker.mode.thralls) if(!shadowling_check(usr)) return - if(ticker.mode.thralls.len >= 5) - user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first." - charge_counter = charge_max - return + if(user.dna.species.id != "shadowling") + if(ticker.mode.thralls.len >= 5) + user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first." + charge_counter = charge_max + return for(var/mob/living/carbon/human/target in targets) if(!in_range(usr, target)) usr << "You need to be closer to enthrall [target]." diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 2af85ca36ba..7d345e71a3b 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -90,4 +90,4 @@ Head of Personnel H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind, list("Supply", "Service")) //tell underlings (suuply/service) they have a head + announce_head(H, list("Supply", "Service")) //tell underlings (suuply/service) they have a head diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index fa8f10f9eff..1d7961293cf 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -41,7 +41,7 @@ Chief Engineer //Equip telebaton H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind, list("Engineering")) //tell underlings (engineering radio) they have a head + announce_head(H, list("Engineering")) //tell underlings (engineering radio) they have a head /* Station Engineer diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index fe7638427f8..c688e4a4303 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -169,8 +169,8 @@ /datum/job/proc/config_check() return 1 -/datum/job/proc/announce_head(var/datum/mind/o_mind, var/channels) //tells the given channel that the given mind is the new department head. See communications.dm for valid channels. +/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. spawn(4) //to allow some initialization if(announcement_systems.len) var/obj/machinery/announcement_system/announcer = pick(announcement_systems) - announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels) + announcer.announce("NEWHEAD", H.real_name, H.job, channels) \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 7485f8442ca..6943b3e27eb 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -35,7 +35,7 @@ Chief Medical Officer H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind, list("Medical")) //tell underlings (medical radio) they have a head + announce_head(H, list("Medical")) //tell underlings (medical radio) they have a head /* Medical Doctor diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 9f571c85ea2..f6b4c365bb8 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -37,7 +37,7 @@ Research Director H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind, list("Science")) //tell underlings (science radio) they have a head + announce_head(H, list("Science")) //tell underlings (science radio) they have a head /* Scientist diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 2d8bdefcbde..616c05e9a05 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -52,7 +52,7 @@ Head of Security L.implanted = 1 H.sec_hud_set_implants() - announce_head(H.mind, list("Security")) //tell underlings (security radio) they have a head + announce_head(H, list("Security")) //tell underlings (security radio) they have a head /* Warden diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index e69df9c883c..738d69b14cf 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -184,13 +184,11 @@ var/list/announcement_systems = list() newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") /obj/machinery/announcement_system/emp_act(severity) - if(stat & (NOPOWER|BROKEN)) - ..(severity) - return - act_up() + if(!(stat & (NOPOWER|BROKEN))) + act_up() ..(severity) /obj/machinery/announcement_system/emag_act() - ..() - emagged = 1 - act_up() \ No newline at end of file + if(!emagged) + emagged = 1 + act_up() diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 82b4a8d59fb..68643c28cb6 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -14,11 +14,11 @@ var/global/mulebot_count = 0 density = 1 anchored = 1 animate_movement=1 - health = 150 //yeah, it's tougher than ed209 because it is a big metal box with wheels --rastaf0 + health = 150 maxhealth = 150 fire_dam_coeff = 0.7 brute_dam_coeff = 0.5 - var/atom/movable/load = null // the loaded crate (usually) + var/atom/movable/load = null bot_type = MULE_BOT model = "MULE" blood_DNA = list() @@ -28,7 +28,7 @@ var/global/mulebot_count = 0 var/turf/target // this is turf to navigate to (location of beacon) var/loaddir = 0 // this the direction to unload onto/load from var/home_destination = "" // tag of home beacon - req_access = list(access_cargo) // added robotics access so assembly line drop-off works properly -veyveyr //I don't think so, Tim. You need to add it to the MULE's hidden robot ID card. -NEO + req_access = list(access_cargo) mode = BOT_IDLE @@ -62,7 +62,6 @@ var/global/mulebot_count = 0 var/datum/job/cargo_tech/J = new/datum/job/cargo_tech botcard.access = J.get_access() prev_access = botcard.access -// botcard.access += access_robotics //Why --Ikki cell = new(src) cell.charge = 2000 cell.maxcharge = 2000 diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index df0ac9636d1..42184779a12 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -298,12 +298,27 @@ // *** THE ORION TRAIL ** // +#define ORION_TRAIL_WINTURN 9 + +//Orion Trail Events +#define ORION_TRAIL_RAIDERS "Raiders" +#define ORION_TRAIL_FLUX "Interstellar Flux" +#define ORION_TRAIL_ILLNESS "Illness" +#define ORION_TRAIL_BREAKDOWN "Breakdown" +#define ORION_TRAIL_LING "Changelings?" +#define ORION_TRAIL_LING_ATTACK "Changeling Ambush" +#define ORION_TRAIL_MALFUNCTION "Malfunction" +#define ORION_TRAIL_COLLISION "Collision" +#define ORION_TRAIL_SPACEPORT "Spaceport" +#define ORION_TRAIL_BLACKHOLE "BlackHole" + /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" icon_state = "arcade" circuit = /obj/item/weapon/circuitboard/arcade/orion_trail + var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. var/engine = 0 var/hull = 0 var/electronics = 0 @@ -316,15 +331,21 @@ var/eventdat = null var/event = null var/list/settlers = list("Harry","Larry","Bob") - var/list/events = list("Raiders" = 3, - "Interstellar Flux" = 1, - "Illness" = 3, - "Breakdown" = 2, - "Malfunction" = 2, - "Collision" = 1 + var/list/events = list(ORION_TRAIL_RAIDERS = 3, + ORION_TRAIL_FLUX = 1, + ORION_TRAIL_ILLNESS = 3, + ORION_TRAIL_BREAKDOWN = 2, + ORION_TRAIL_LING = 3, + ORION_TRAIL_MALFUNCTION = 2, + ORION_TRAIL_COLLISION = 1, + ORION_TRAIL_SPACEPORT = 2 ) var/list/stops = list() var/list/stopblurbs = list() + var/lings_aboard = 0 + var/spaceport_raided = 0 + var/spaceport_freebie = 0 + var/last_spaceport_action = "" /obj/machinery/computer/arcade/orion_trail/New() ..() @@ -345,14 +366,9 @@ /obj/machinery/computer/arcade/orion_trail/proc/newgame() // Set names of settlers in crew settlers = list() - var/choice = null for(var/i = 1; i <= 3; i++) - if(prob(50)) - choice = pick(first_names_male) - else - choice = pick(first_names_female) - settlers += choice - settlers += "[usr]" + add_crewmember() + add_crewmember("[usr]") // Re-set items to defaults engine = 1 hull = 1 @@ -364,6 +380,12 @@ event = null playing = 1 gameover = 0 + lings_aboard = 0 + + //spaceport junk + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" /obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) if(..()) @@ -412,18 +434,19 @@ dat += "

Crew:

" dat += english_list(settlers) dat += "
Food: [food] | Fuel: [fuel]" - dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]
" + dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" if(turns == 7) dat += "

Go Around Continue

" else dat += "

Continue

" + dat += "

Kill a crewmember

" dat += "

Close

" else dat = "

The Orion Trail

" dat += "

Experience the journey of your ancestors!



" dat += "
New Game
" dat += "

Close

" - var/datum/browser/popup = new(user, "arcade", "The Orion Trail") + var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700) popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() @@ -435,34 +458,31 @@ if(href_list["close"]) usr.unset_machine() usr << browse(null, "window=arcade") - else if (href_list["continue"]) //Continue your travels - if(turns >= 9) + + if(busy) + return + busy = 1 + + if (href_list["continue"]) //Continue your travels + if(turns >= ORION_TRAIL_WINTURN) win() - else if(turns == 2) - if(prob(30)) - event = "Collision" - event() - food -= alive*2 - fuel -= 5 - turns += 1 - else - food -= alive*2 - fuel -= 5 - turns += 1 - if(prob(75)) - event = pickweight(events) - event() else - food -= alive*2 + food -= (alive+lings_aboard)*2 fuel -= 5 - turns += 1 - if(prob(75)) - event = pickweight(events) + if(turns == 2 && prob(30)) + event = ORION_TRAIL_COLLISION event() + else if(prob(75)) + event = pickweight(events) + if(lings_aboard) + if(event == ORION_TRAIL_LING || prob(55)) + event = ORION_TRAIL_LING_ATTACK + event() + turns += 1 if(emagged) var/mob/living/carbon/M = usr //for some vars switch(event) - if("Raiders") + if(ORION_TRAIL_RAIDERS) if(prob(50)) usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" M.hallucination += 30 @@ -470,7 +490,7 @@ usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." M.take_organ_damage(30) playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) - if("Illness") + if(ORION_TRAIL_ILLNESS) var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS if(severity == 1) M << "You suddenly feel slightly nauseous." //got off lucky @@ -481,38 +501,38 @@ M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." M.Stun(5) sleep(30) - M.visible_message("[M] throws up!", "You violently throw up!") + say("[M] violently throws up!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) M.nutrition -= 50 //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) location.add_vomit_floor(src, 1) - if("Interstellar Flux") + if(ORION_TRAIL_FLUX) if(prob(75)) M.Weaken(3) - M.visible_message("[M] is swept off their feet!", "A sudden gust of powerful wind slams you into the floor!") + say("A sudden gust of powerful wind slams [M] into the floor!") M.take_organ_damage(25) playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) else M << "A violent gale blows past you, and you barely manage to stay standing!" - if("Collision") //by far the most damaging event + if(ORION_TRAIL_COLLISION) //by far the most damaging event if(prob(90)) playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) var/turf/simulated/floor/F for(F in orange(1, src)) F.ChangeTurf(F.baseturf) - src.visible_message("Something slams into the floor around [src], exposing it to space!") + say("Something slams into the floor around [src], exposing it to space!") if(hull) sleep(10) - src.visible_message("A new floor suddenly appears around [src]. What the hell?") + say("A new floor suddenly appears around [src]. What the hell?") playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) var/turf/space/T for(T in orange(1, src)) T.ChangeTurf(/turf/simulated/floor/plating/) else - src.visible_message("Something slams into the floor around [src] - luckily, it didn't get through!") + say("Something slams into the floor around [src] - luckily, it didn't get through!") playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) - if("Malfunction") + if(ORION_TRAIL_MALFUNCTION) playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) src.visible_message("[src] malfunctions, randomizing in-game stats!") var/oldfood = food @@ -529,7 +549,6 @@ fuel = oldfuel playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) - else if(href_list["newgame"]) //Reset everything newgame() else if(href_list["menu"]) //back to the main menu @@ -540,11 +559,11 @@ fuel = 60 settlers = list("Harry","Larry","Bob") else if(href_list["slow"]) //slow down - food -= alive*2 + food -= (alive+lings_aboard)*2 fuel -= 5 event = null else if(href_list["pastblack"]) //slow down - food -= (alive*2)*3 + food -= ((alive+lings_aboard)*2)*3 fuel -= 15 turns += 1 event = null @@ -558,7 +577,7 @@ hull -= 1 event = null else if(href_list["wait"]) //wait 3 days - food -= (alive*2)*3 + food -= ((alive+lings_aboard)*2)*3 event = null else if(href_list["keepspeed"]) //keep speed if(prob(75)) @@ -568,16 +587,16 @@ event = null else if(href_list["blackhole"]) //keep speed past a black hole if(prob(75)) - event = "BlackHole" + event = ORION_TRAIL_BLACKHOLE event() if(emagged) //has to be here because otherwise it doesn't work playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) - src.visible_message("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") + say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") usr.Stun(10) //you can't run :^) var/S = new /obj/singularity/academy(usr.loc) emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting sleep(50) - src.visible_message("[S] winks out, just as suddenly as it appeared.") + say("[S] winks out, just as suddenly as it appeared.") qdel(S) else event = null @@ -588,88 +607,378 @@ else if(href_list["eventclose"]) //end an event event = null + else if(href_list["killcrew"]) //shoot a crewmember + var/sheriff = remove_crewmember() //I shot the sheriff + playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) + + if(settlers.len == 0 || alive == 0) + say("The last crewmember [sheriff], shot themselves, GAME OVER!") + if(emagged) + usr.death(0) + emagged = 0 + gameover = 1 + event = null + else if(emagged) + if(usr.name == sheriff) + say("The crew of the ship chose to kill [usr.name]!") + usr.death(0) + + if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places + event = null + + //Spaceport specific interactions + //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) + //they also call event() again, to regen the eventdata, which is kind of odd but necessary + else if(href_list["buycrew"]) //buy a crewmember + var/bought = add_crewmember() + last_spaceport_action = "You hired [bought] as a new crewmember." + fuel -= 10 + food -= 10 + event() + + else if(href_list["sellcrew"]) //sell a crewmember + var/sold = remove_crewmember() + last_spaceport_action = "You sold your crewmember, [sold]!" + fuel += 15 + food += 15 + event() + + else if(href_list["leave_spaceport"]) + event = null + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" + + else if(href_list["raid_spaceport"]) + var/success = min(15 * alive,100) //default crew (4) have a 60% chance + spaceport_raided = 1 + + var/FU = 0 + var/FO = 0 + if(prob(success)) + FU = rand(5,15) + FO = rand(5,15) + last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + else + FU = rand(-5,-15) + FO = rand(-5,-15) + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" + + //your chance of lose a crewmember is 1/2 your chance of success + //this makes higher % failures hurt more, don't get cocky space cowboy! + if(prob(success*5)) + var/lost_crew = remove_crewmember() + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" + if(emagged) + say("WEEWOO WEEWOO, Spaceport Security en route!") + for(var/i, i<=3, i++) + var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) + O.target = usr + + + fuel += FU + food += FO + event() + + else if(href_list["buyparts"]) + switch(text2num(href_list["buyparts"])) + if(1) //Engine Parts + engine++ + last_spaceport_action = "Bought Engine Parts" + if(2) //Hull Plates + hull++ + last_spaceport_action = "Bought Hull Plates" + if(3) //Spare Electronics + electronics++ + last_spaceport_action = "Bought Spare Electronics" + fuel -= 5 //they all cost 5 + event() + + else if(href_list["trade"]) + switch(text2num(href_list["trade"])) + if(1) //Fuel + fuel -= 5 + food += 5 + last_spaceport_action = "Traded Fuel for Food" + if(2) //Food + fuel += 5 + food -= 5 + last_spaceport_action = "Traded Food for Fuel" + event() + src.add_fingerprint(usr) src.updateUsrDialog() + busy = 0 return /obj/machinery/computer/arcade/orion_trail/proc/event() eventdat = "

[event]

" - if(event == "Raiders") - eventdat += "Raiders have come aboard your ship!" + + switch(event) + if(ORION_TRAIL_RAIDERS) + eventdat += "Raiders have come aboard your ship!" + if(prob(50)) + var/sfood = rand(1,10) + var/sfuel = rand(1,10) + food -= sfood + fuel -= sfuel + eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel." + else if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] tried to fight back but was killed." + else + eventdat += "
Fortunately you fended them off without any trouble." + eventdat += "

Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_FLUX) + eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies." + eventdat += "
What will you do?" + eventdat += "

Slow Down Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_ILLNESS) + eventdat += "A deadly illness has been contracted!" + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by the disease." + eventdat += "

Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_BREAKDOWN) + eventdat += "Oh no! The engine has broken down!" + eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days." + if(engine >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_MALFUNCTION) + eventdat += "The ship's systems are malfunctioning!" + eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." + if(electronics >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_COLLISION) + eventdat += "Something hit us! Looks like there's some hull damage." + if(prob(25)) + var/sfood = rand(5,15) + var/sfuel = rand(5,15) + food -= sfood + fuel -= sfuel + eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." + if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by rapid depressurization." + eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." + if(hull >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_BLACKHOLE) + eventdat += "You were swept away into the black hole." + eventdat += "

Oh...

" + eventdat += "

Close

" + settlers = list() + + if(ORION_TRAIL_LING) + eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..." + if(settlers.len <= 1) + eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..." + eventdat += "

Continue

" + eventdat += "

Close

" + if(prob(10)) // "likely", I didn't say it was guaranteed! + lings_aboard = min(++lings_aboard,2) + else + if(lings_aboard) //less likely to stack lings + if(prob(20)) + lings_aboard = min(++lings_aboard,2) + else if(prob(70)) + lings_aboard = min(++lings_aboard,2) + + eventdat += "

Kill a crewmember

" + eventdat += "

Risk it

" + eventdat += "

Close

" + + if(ORION_TRAIL_LING_ATTACK) + if(lings_aboard <= 0) //shouldn't trigger, but hey. + eventdat += "Haha, fooled you, there are no changelings on board!" + eventdat += "
(You should report this to a coder :S)" + else + var/ling1 = remove_crewmember() + var/ling2 = "" + if(lings_aboard >= 2) + ling2 = remove_crewmember() + + eventdat += "Oh no, some of your crew are Changelings!" + if(ling2) + eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!" + else + eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!" + + var/chance2attack = alive*20 + if(prob(chance2attack)) + var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance + if(prob(chancetokill)) + var/deadguy = remove_crewmember() + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" + else + eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!" + eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww" + if(ling2) + food += 30 + lings_aboard = max(0,lings_aboard-2) + else + food += 15 + lings_aboard = max(0,--lings_aboard) + else + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!" + if(ling2) + lings_aboard = max(0,lings_aboard-2) + else + lings_aboard = max(0,--lings_aboard) + + eventdat += "

Continue

" + eventdat += "

Close

" + + + if(ORION_TRAIL_SPACEPORT) + if(spaceport_raided) + eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Depart Spaceport

" + eventdat += "

Close

" + else + eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!" + eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..." + eventdat += "
Trading terms: FU = Fuel, FO = Food" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Crew:

" + eventdat += english_list(settlers) + eventdat += "
Food: [food] | Fuel: [fuel]" + eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" + + + //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port) + if(!spaceport_freebie && (fuel < 20 || food < 20)) + spaceport_freebie++ + var/FU = 10 + var/FO = 10 + var/freecrew = 0 + if(prob(30)) + FU = 25 + FO = 25 + + if(prob(10)) + add_crewmember() + freecrew++ + + eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)" + if(freecrew) + eventdat += "
You also gain a new crewmember!" + + fuel += FU + food += FO + + //CREW INTERACTIONS + eventdat += "

Crew Management:

" + + //Buy crew + if(food >= 10 && fuel >= 10) + eventdat += "

Hire a new Crewmember (-10FU,-10FO)

" + else + eventdat += "

Cant afford a new Crewmember

" + + //Sell crew + if(settlers.len > 1) + eventdat += "

Sell crew for Fuel and Food (+15FU,+15FO)

" + else + eventdat += "

Cant afford to sell a Crewmember

" + + //BUY/SELL STUFF + eventdat += "

Spare Parts:

" + + //Engine parts + if(fuel > 5) + eventdat += "

Buy Engine Parts (-5FU)

" + else + eventdat += "

Cant afford to buy Engine Parts" + + //Hull plates + if(fuel > 5) + eventdat += "

Buy Hull Plates (-5FU)

" + else + eventdat += "

Cant afford to buy Hull Plates" + + //Electronics + if(fuel > 5) + eventdat += "

Buy Spare Electronics (-5FU)

" + else + eventdat += "

Cant afford to buy Spare Electronics" + + //Trade + if(fuel > 5) + eventdat += "

Trade Fuel for Food (-5FU,+5FO)

" + else + eventdat += "

Cant afford to Trade Fuel for Food 5) + eventdat += "

Trade Food for Fuel (+5FU,-5FO)

" + else + eventdat += "

Cant afford to Trade Food for Fuel= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - else if(event == "Malfunction") - eventdat += "The ship's systems are malfunctioning!" - eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." - if(electronics >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" +//Remove Random/Specific crewmember +/obj/machinery/computer/arcade/orion_trail/proc/remove_crewmember(var/specific = "", var/dont_remove = "") + var/list/safe2remove = settlers + var/removed = "" + if(dont_remove) + safe2remove -= dont_remove + if(specific && specific != dont_remove) + safe2remove = list(specific) + else + removed = pick(safe2remove) - else if(event == "Collision") - eventdat += "Something hit us! Looks like there's some hull damage." - if(prob(25)) - var/sfood = rand(5,15) - var/sfuel = rand(5,15) - food -= sfood - fuel -= sfuel - eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." - if(prob(10)) - var/deadname = pick_n_take(settlers) - eventdat += "
[deadname] was killed by rapid depressurization." - alive -= 1 - eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." - if(hull >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - else if(event == "BlackHole") - eventdat += "You were swept away into the black hole." - eventdat += "

Oh...

" - eventdat += "

Close

" - settlers = list() + if(removed) + if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously + lings_aboard = max(0,--lings_aboard) + settlers -= removed + alive-- + return removed /obj/machinery/computer/arcade/orion_trail/proc/win() playing = 0 + say("Congratulations, you made it to Orion!") if(emagged) new /obj/item/weapon/orion_ship(src.loc) message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") @@ -688,6 +997,26 @@ newgame() emagged = 1 +/mob/living/simple_animal/hostile/syndicate/ranged/orion + name = "Spaceport Security" + desc = "The Premier security forces for all spaceports found along the Orion Trail." + faction = list("orion") + corpse = /obj/effect/landmark/mobcorpse/orionsecurity + +/obj/effect/landmark/mobcorpse/orionsecurity + name = "Spaceport Security" + corpseuniform = /obj/item/clothing/under/syndicate + corpsesuit = /obj/item/clothing/suit/armor/vest + corpseshoes = /obj/item/clothing/shoes/combat + corpsegloves = /obj/item/clothing/gloves/combat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas + corpsehelmet = /obj/item/clothing/head/helmet/swat + corpseback = /obj/item/weapon/storage/backpack + corpseid = 1 + corpseidjob = "Officer" + corpseidaccess = "Syndicate" + /obj/item/weapon/orion_ship name = "model settler ship" desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." @@ -726,4 +1055,17 @@ sleep(3.6) src.visible_message("[src] explodes!") explosion(src.loc, 1,2,4, flame_range = 3) - qdel(src) \ No newline at end of file + qdel(src) + + +#undef ORION_TRAIL_WINTURN +#undef ORION_TRAIL_RAIDERS +#undef ORION_TRAIL_FLUX +#undef ORION_TRAIL_ILLNESS +#undef ORION_TRAIL_BREAKDOWN +#undef ORION_TRAIL_LING +#undef ORION_TRAIL_LING_ATTACK +#undef ORION_TRAIL_MALFUNCTION +#undef ORION_TRAIL_COLLISION +#undef ORION_TRAIL_SPACEPORT +#undef ORION_TRAIL_BLACKHOLE diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index d49f0c1cee5..4d30422e833 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -128,7 +128,7 @@ build_path = /obj/machinery/computer/arcade/battle origin_tech = "programming=1" /obj/item/weapon/circuitboard/arcade/orion_trail - name = "circuit board (Orion_Trail)" + name = "circuit board (Orion Trail)" build_path = /obj/machinery/computer/arcade/orion_trail /obj/item/weapon/circuitboard/turbine_control name = "circuit board (Turbine control)" diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 337dd01132e..6ce6246dbad 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -29,9 +29,6 @@ return 0 set_ready_state(0) - chassis.can_move = 0 - spawn(shot_delay*projectiles_per_shot) - chassis.can_move = 1 for(var/i=1 to get_shot_amount()) var/obj/item/projectile/A = new projectile(curloc) A.firer = chassis.occupant diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ce2a1fc1875..6b4660a28f0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -9,6 +9,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s //Not on /clothing because for some reason any /obj/item can technically be "worn" with enough fuckery. var/icon/alternate_worn_icon = null//If this is set, update_icons() will find on mob (WORN, NOT INHANDS) states in this file instead, primary use: badminnery/events + var/alternate_worn_layer = null//If this is set, update_icons() will force the on mob state (WORN, NOT INHANDS) onto this layer, instead of it's default var/hitsound = null var/throwhitsound = null diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index c32a35c5b89..866a51ea5f4 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -36,27 +36,36 @@ icon = 'icons/obj/bodybag.dmi' icon_state = "bodybag" var/foldedbag_path = /obj/item/bodybag + var/tagged = 0 // so closet code knows to put the tag overlay back density = 0 mob_storage_capacity = 2 /obj/structure/closet/body_bag/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/weapon/pen)) + if (istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/toy/crayon)) var/t = stripped_input(user, "What would you like the label to be?", name, null, 53) if(user.get_active_hand() != I) return if(!in_range(src, user) && loc != user) return if(t) - name = "body bag - " - name += t - overlays += "bodybag_label" + name = "body bag - [t]" + tagged = 1 + update_icon() else name = "body bag" return else if(istype(I, /obj/item/weapon/wirecutters)) - user << "You cut the tag off of [src]." + user << "You cut the tag off [src]." name = "body bag" + tagged = 0 + update_icon() + +/obj/structure/closet/body_bag/update_icon() + ..() + if (tagged) + overlays += "bodybag_label" + else overlays.Cut() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 1e95e040502..25bbb762e03 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -205,6 +205,7 @@ /obj/item/weapon/gun/projectile/revolver, /obj/item/ammo_box, ) + alternate_worn_layer = UNDER_SUIT_LAYER /obj/item/weapon/storage/belt/fannypack name = "fannypack" diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 27c6aaebef1..32ad17dc3c7 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -7,8 +7,8 @@ LINEN BINS /obj/item/weapon/bedsheet name = "bedsheet" desc = "A surprisingly soft linen bedsheet." - icon = 'icons/obj/items.dmi' - icon_state = "sheet" + icon = 'icons/obj/bedsheets.dmi' + icon_state = "white" item_state = "bedsheet" slot_flags = SLOT_BACK layer = 4.0 @@ -41,129 +41,133 @@ LINEN BINS ..() /obj/item/weapon/bedsheet/blue - icon_state = "sheetblue" + icon_state = "blue" item_color = "blue" /obj/item/weapon/bedsheet/green - icon_state = "sheetgreen" + icon_state = "green" item_color = "green" /obj/item/weapon/bedsheet/orange - icon_state = "sheetorange" + icon_state = "orange" item_color = "orange" /obj/item/weapon/bedsheet/purple - icon_state = "sheetpurple" + icon_state = "purple" item_color = "purple" /obj/item/weapon/bedsheet/patriot name = "patriotic bedsheet" desc = "You've never felt more free than when sleeping on this." - icon_state = "sheetUSA" + icon_state = "USA" item_color = "sheetUSA" /obj/item/weapon/bedsheet/rainbow name = "rainbow bedsheet" - desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together." - icon_state = "sheetrainbow" + desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together." + icon_state = "rainbow" item_color = "rainbow" /obj/item/weapon/bedsheet/red - icon_state = "sheetred" + icon_state = "red" item_color = "red" /obj/item/weapon/bedsheet/yellow - icon_state = "sheetyellow" + icon_state = "yellow" item_color = "yellow" /obj/item/weapon/bedsheet/mime name = "mime's blanket" desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this." - icon_state = "sheetmime" + icon_state = "mime" item_color = "mime" /obj/item/weapon/bedsheet/clown name = "clown's blanket" - desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas." - icon_state = "sheetclown" + desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas." + icon_state = "clown" item_color = "clown" /obj/item/weapon/bedsheet/captain name = "captain's bedsheet" desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains." - icon_state = "sheetcaptain" + icon_state = "captain" item_color = "captain" /obj/item/weapon/bedsheet/rd name = "research director's bedsheet" desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day." - icon_state = "sheetrd" + icon_state = "rd" item_color = "director" /obj/item/weapon/bedsheet/medical name = "medical blanket" desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station." - icon_state = "sheetmedical" + icon_state = "medical" item_color = "medical" /obj/item/weapon/bedsheet/cmo name = "chief medical officer's bedsheet" - desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime." - icon_state = "sheetcmo" + desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime." + icon_state = "cmo" item_color = "cmo" /obj/item/weapon/bedsheet/hos name = "head of security's bedsheet" - desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!" - icon_state = "sheethos" + desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!" + icon_state = "hos" item_color = "hosred" /obj/item/weapon/bedsheet/hop name = "head of personnel's bedsheet" - desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio." - icon_state = "sheethop" + desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio." + icon_state = "hop" item_color = "hop" /obj/item/weapon/bedsheet/ce name = "chief engineer's bedsheet" - desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil." - icon_state = "sheetce" + desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil." + icon_state = "ce" item_color = "chief" /obj/item/weapon/bedsheet/qm name = "quartermaster's bedsheet" desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper." - icon_state = "sheetqm" + icon_state = "qm" item_color = "qm" /obj/item/weapon/bedsheet/brown - icon_state = "sheetbrown" + icon_state = "brown" item_color = "cargo" /obj/item/weapon/bedsheet/centcom name = "\improper Centcom bedsheet" desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials." - icon_state = "sheetcentcom" + icon_state = "centcom" item_color = "centcom" /obj/item/weapon/bedsheet/syndie name = "syndicate bedsheet" desc = "It has a syndicate emblem and it has an aura of evil." - icon_state = "sheetsyndie" + icon_state = "syndie" item_color = "syndie" /obj/item/weapon/bedsheet/cult name = "cultist's bedsheet" - desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence." - icon_state = "sheetcult" + desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence." + icon_state = "cult" item_color = "cult" /obj/item/weapon/bedsheet/wiz name = "wizard's bedsheet" - desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!" - icon_state = "sheetwiz" + desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!" + icon_state = "wiz" item_color = "wiz" +/obj/item/weapon/bedsheet/ian + icon_state = "ian" + item_color = "ian" + /obj/structure/bedsheetbin name = "linen bin" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e41fac7870f..bb209cb9515 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -46,6 +46,7 @@ overlays += "unlocked" else overlays += "off" + else if(icon_door_override) overlays += "[icon_door]_open" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 8844b5c5be4..976ce7085e3 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -40,7 +40,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that switch(alert("Proc owned by something?",,"Yes","No")) if("Yes") targetselected = 1 - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") + if(src.holder && src.holder.marked_datum) + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])") + if(class == "Marked datum ([holder.marked_datum.type])") + class = "Marked datum" + else + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") switch(class) if("Obj") target = input("Enter target:","Target",usr) as obj in world @@ -53,6 +58,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/client/C) keys += C target = input("Please, select a player!", "Selection", null, null) as null|anything in keys + if("Marked datum") + target = holder.marked_datum else return if("No") @@ -61,7 +68,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null if(!procname) return - + if(targetselected && !hascall(target,procname)) + usr << "Error: callproc(): target has no such call [procname]." + return var/list/lst = get_callproc_args() if(!lst) return @@ -70,9 +79,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!target) usr << "Error: callproc(): owner of proc no longer exists." return - if(!hascall(target,procname)) - usr << "Error: callproc(): target has no such call [procname]." - return log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc else @@ -93,7 +99,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null if(!procname) return - + if(!hascall(A,procname)) + usr << "Error: callproc_datum(): target has no such call [procname]." + return var/list/lst = get_callproc_args() if(!lst) return @@ -101,9 +109,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!A || !IsValidSrc(A)) usr << "Error: callproc_datum(): owner of proc no longer exists." return - if(!hascall(A,procname)) - usr << "Error: callproc_datum(): target has no such call [procname]." - return log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") spawn() @@ -115,15 +120,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/get_callproc_args() var/argnum = input("Number of arguments","Number:",0) as num|null if(!argnum && (argnum!=0)) return - + var/list/lst = list() //TODO: make a list to store whether each argument was initialised as null. //Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists //this will protect us from a fair few errors ~Carn while(argnum--) + var/class = null // Make a list with each index containing one variable, to be given to the proc - var/class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL") + if(src.holder && src.holder.marked_datum) + class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL") + if(holder.marked_datum && class == "Marked datum ([holder.marked_datum.type])") + class = "Marked datum" + else + class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL") switch(class) if("CANCEL") return null @@ -158,6 +169,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if("mob's area") var/mob/temp = input("Select mob", "Selection", usr) as mob in world lst += temp.loc + if("Marked datum") + lst += holder.marked_datum return lst diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index ec1fd6b67fb..1303a8ee03b 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -9,11 +9,6 @@ origin_tech = "biotech=3" var/braintype = "Cyborg" - req_access = list(access_robotics) - - //Revised. Brainmob is now contained directly within object of transfer. MMI in this case. - - var/locked = 0 var/syndiemmi = 0 //Whether or not this is a Syndicate MMI var/mob/living/carbon/brain/brainmob = null //The current occupant. var/mob/living/silicon/robot = null //Appears unused. @@ -63,19 +58,10 @@ name = "Man-Machine Interface: [brainmob.real_name]" update_icon() - locked = 1 - feedback_inc("cyborg_mmis_filled",1) return - if((istype(O,/obj/item/weapon/card/id)||istype(O,/obj/item/device/pda)) && brainmob) - if(allowed(user)) - locked = !locked - user << "You [locked ? "lock" : "unlock"] the brain holder." - else - user << "Access denied." - return if(brainmob) O.attack(brainmob, user) //Oh noooeeeee return @@ -84,10 +70,8 @@ /obj/item/device/mmi/attack_self(mob/user) if(!brain) user << "You upend the MMI, but there's nothing in it!" - else if(locked) - user << "You upend the MMI, but the brain is clamped into place!" else - user << "You upend the MMI, spilling the brain onto the floor." + user << "You unlock and upend the MMI, spilling the brain onto the floor." brainmob.container = null //Reset brainmob mmi var. brainmob.loc = brain //Throw mob into brain. @@ -116,7 +100,6 @@ name = "Man-Machine Interface: [brainmob.real_name]" update_icon() - locked = 1 return /obj/item/device/mmi/radio_enabled diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 79817af275c..7f8445b95fc 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -11,7 +11,6 @@ var/global/posibrain_notif_cooldown = 0 var/askDelay = 10 * 60 * 1 brainmob = null req_access = list(access_robotics) - locked = 0 mecha = null//This does not appear to be used outside of reference in mecha.dm. braintype = "Android" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 362a423eb50..8f8f5829970 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -212,13 +212,18 @@ Please contact me on #coderbus IRC. ~Carnie x var/image/standing var/iconfile2use //Which icon file to use to generate the overlay and any female alterations. + var/layer2use if(U.alternate_worn_icon) iconfile2use = U.alternate_worn_icon if(!iconfile2use) iconfile2use = 'icons/mob/uniform.dmi' + if(U.alternate_worn_layer) + layer2use = U.alternate_worn_layer + if(!layer2use) + layer2use = UNIFORM_LAYER - standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER) + standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-layer2use) overlays_standing[UNIFORM_LAYER] = standing @@ -266,11 +271,17 @@ Please contact me on #coderbus IRC. ~Carnie x var/t_state = gloves.item_state if(!t_state) t_state = gloves.icon_state + var/layer2use + if(gloves.alternate_worn_layer) + layer2use = gloves.alternate_worn_layer + if(!layer2use) + layer2use = GLOVES_LAYER + var/image/standing if(gloves.alternate_worn_icon) - standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-GLOVES_LAYER) + standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-GLOVES_LAYER) + standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-layer2use) overlays_standing[GLOVES_LAYER] = standing @@ -294,11 +305,17 @@ Please contact me on #coderbus IRC. ~Carnie x glasses.screen_loc = ui_glasses //...draw the item in the inventory screen client.screen += glasses //Either way, add the item to the HUD + var/layer2use + if(glasses.alternate_worn_layer) + layer2use = glasses.alternate_worn_layer + if(!layer2use) + layer2use = GLASSES_LAYER + var/image/standing if(glasses.alternate_worn_icon) - standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-GLASSES_LAYER) + standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-GLASSES_LAYER) + standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-layer2use) overlays_standing[GLASSES_LAYER] = standing @@ -314,11 +331,17 @@ Please contact me on #coderbus IRC. ~Carnie x ears.screen_loc = ui_ears //...draw the item in the inventory screen client.screen += ears //Either way, add the item to the HUD + var/layer2use + if(ears.alternate_worn_layer) + layer2use = ears.alternate_worn_layer + if(!layer2use) + layer2use = EARS_LAYER + var/image/standing if(ears.alternate_worn_icon) - standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER) + standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER) + standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-layer2use) overlays_standing[EARS_LAYER] = standing @@ -334,11 +357,17 @@ Please contact me on #coderbus IRC. ~Carnie x shoes.screen_loc = ui_shoes //...draw the item in the inventory screen client.screen += shoes //Either way, add the item to the HUD + var/layer2use + if(shoes.alternate_worn_layer) + layer2use = shoes.alternate_worn_layer + if(!layer2use) + layer2use = SHOES_LAYER + var/image/standing if(shoes.alternate_worn_icon) - standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-SHOES_LAYER) + standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-SHOES_LAYER) + standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-layer2use) overlays_standing[SHOES_LAYER] = standing if(shoes.blood_DNA) @@ -384,11 +413,17 @@ Please contact me on #coderbus IRC. ~Carnie x var/t_state = belt.item_state if(!t_state) t_state = belt.icon_state + var/layer2use + if(belt.alternate_worn_layer) + layer2use = belt.alternate_worn_layer + if(!layer2use) + layer2use = BELT_LAYER + var/image/standing if(belt.alternate_worn_icon) - standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-BELT_LAYER) + standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-BELT_LAYER) + standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-layer2use) overlays_standing[BELT_LAYER] = standing @@ -405,11 +440,18 @@ Please contact me on #coderbus IRC. ~Carnie x wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen client.screen += wear_suit //Either way, add the item to the HUD + + var/layer2use + if(wear_suit.alternate_worn_layer) + layer2use = wear_suit.alternate_worn_layer + if(!layer2use) + layer2use = SUIT_LAYER + var/image/standing if(wear_suit.alternate_worn_icon) - standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER) + standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER) + standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use) overlays_standing[SUIT_LAYER] = standing if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 163ccdae8b1..b8129dd15c9 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -96,11 +96,18 @@ /mob/living/carbon/update_inv_wear_mask() remove_overlay(FACEMASK_LAYER) if(istype(wear_mask, /obj/item/clothing/mask)) + + var/layer2use + if(wear_mask.alternate_worn_layer) + layer2use = wear_mask.alternate_worn_layer + if(!layer2use) + layer2use = FACEMASK_LAYER + var/image/standing if(wear_mask.alternate_worn_icon) - standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) + standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) + standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use) overlays_standing[FACEMASK_LAYER] = standing @@ -111,11 +118,18 @@ /mob/living/carbon/update_inv_back() remove_overlay(BACK_LAYER) if(back) + + var/layer2use + if(back.alternate_worn_layer) + layer2use = back.alternate_worn_layer + if(!layer2use) + layer2use = BACK_LAYER + var/image/standing if(back.alternate_worn_icon) - standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) + standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) + standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-layer2use) overlays_standing[BACK_LAYER] = standing return back @@ -124,11 +138,18 @@ /mob/living/carbon/update_inv_head() remove_overlay(HEAD_LAYER) if(head) + + var/layer2use + if(head.alternate_worn_layer) + layer2use = head.alternate_worn_layer + if(!layer2use) + layer2use = HEAD_LAYER + var/image/standing if(head.alternate_worn_icon) - standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) + standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-layer2use) if(!standing) - standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) + standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-layer2use) standing.color = head.color // For now, this is here solely for kitty ears, but everything should do this eventually standing.alpha = head.alpha diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e37ec22d115..e978c6c37a6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -108,7 +108,6 @@ mmi = new(src) mmi.brain = new /obj/item/organ/brain(mmi) mmi.brain.name = "[real_name]'s brain" - mmi.locked = 1 mmi.icon_state = "mmi_full" mmi.name = "Man-Machine Interface: [real_name]" mmi.brainmob = new(src) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 580a7172ba3..b102ef80167 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -32,7 +32,6 @@ var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!" - /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() if(summoner) @@ -118,6 +117,7 @@ for(var/mob/M in mob_list) if(M == src.summoner) M << "[src]: [input]" + src << "[src]: [input]" /mob/living/proc/guardian_comm() set name = "Communicate" @@ -128,7 +128,7 @@ for(var/mob/living/simple_animal/hostile/guardian/M in mob_list) if(M.summoner == src) M << "[src]: [input]" - + src << "[src]: [input]" //////////////////////////TYPES OF GUARDIANS @@ -138,11 +138,11 @@ /mob/living/simple_animal/hostile/guardian/fire a_intent = "help" - melee_damage_lower = 15 - melee_damage_upper = 15 + melee_damage_lower = 10 + melee_damage_upper = 10 attack_sound = 'sound/items/Welder.ogg' attacktext = "sears" - damage_transfer = 0.6 + damage_transfer = 0.7 range = 10 playstyle_string = "As a fire type, you have only light damage resistance, but will ignite any enemy you bump into." environment_smash = 1 @@ -155,7 +155,7 @@ if(istype(AM, /mob/living/)) var/mob/living/M = AM if(AM != src.summoner) - M.adjust_fire_stacks(20) + M.adjust_fire_stacks(10) M.IgniteMob() //Standard @@ -163,7 +163,7 @@ /mob/living/simple_animal/hostile/guardian/punch melee_damage_lower = 25 melee_damage_upper = 25 - damage_transfer = 0.4 + damage_transfer = 0.5 playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." environment_smash = 2 magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." @@ -183,26 +183,23 @@ /mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() ..() - src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]\ - [src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) + if(istype(target, /mob/living)) + src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]\ + [src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + //Fast Standard. Does less damage, has less resistance, but moves faster, has higher range /mob/living/simple_animal/hostile/guardian/fast - melee_damage_lower = 25 - melee_damage_upper = 25 - damage_transfer = 0.6 + melee_damage_lower = 20 + melee_damage_upper = 20 + damage_transfer = 0.7 speed = -1 range = 15 attacktext = "slices" @@ -247,6 +244,7 @@ /mob/living/simple_animal/hostile/guardian/healer a_intent = "help" friendly = "heals" + speed = 1 melee_damage_lower = 0 melee_damage_upper = 0 playstyle_string = "As a healer type, you are incapable of attacking, but can mend any wound simply by touching a target." @@ -256,6 +254,9 @@ /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() ..() + if(src.loc == summoner) + src << "You must be manifested to heal!" + return if(iscarbon(target)) var/mob/living/carbon/C = target C.adjustBruteLoss(-5) @@ -263,21 +264,26 @@ C.adjustOxyLoss(-5) C.adjustToxLoss(-5) +/obj/item/projectile/guardian + name = "crystal spray" + icon_state = "guardian" + damage = 4 + damage_type = BRUTE + /mob/living/simple_animal/hostile/guardian/ranged a_intent = "help" melee_damage_lower = 10 melee_damage_upper = 10 damage_transfer = 1.2 - projectiletype = /obj/item/projectile/neurotox - ranged_cooldown_cap = 1 - projectilesound = 'sound/weapons/pierce.ogg' + projectiletype = /obj/item/projectile/guardian + ranged_cooldown_cap = 0 + projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' ranged = 1 - rapid = 1 range = 13 - playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying neurotoxin." + playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Nanoswarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spitting neurotoxin." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal." /mob/living/simple_animal/hostile/guardian/bluespace @@ -313,6 +319,9 @@ var/bomb_cooldown = 0 /mob/living/simple_animal/hostile/guardian/bomb/ShiftClickOn(atom/movable/A) + if(src.loc == summoner) + src << "You must be manifested to create bombs!" + return if(istype(A, /obj/)) if(bomb_cooldown <= world.time && !stat) var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) @@ -334,6 +343,8 @@ /obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) A.loc = src stored_obj = A + anchored = A.anchored + density = A.density appearance = A.appearance spawn(600) stored_obj.loc = get_turf(src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index c51fc8e17b1..1f24ed85e1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -35,6 +35,8 @@ /mob/living/simple_animal/hostile/Life() . = ..() + if(ranged) + ranged_cooldown-- if(!.) //dead walk(src, 0) //stops walking return 0 @@ -42,8 +44,6 @@ /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) return 0 - if(ranged) - ranged_cooldown-- var/list/possible_targets = ListTargets() //we look around for potential targets and make it a list for later use. if(environment_smash) @@ -315,4 +315,4 @@ . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) - return !FindTarget(possible_targets, 1) \ No newline at end of file + return !FindTarget(possible_targets, 1) diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 0a89745dfcf..ef0d35fb175 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -122,12 +122,12 @@ projectile_type = /obj/item/projectile/plasma select_name = "plasma burst" fire_sound = 'sound/weapons/Laser.ogg' - delay = 10 + delay = 15 e_cost = 25 /obj/item/ammo_casing/energy/plasma/adv projectile_type = /obj/item/projectile/plasma/adv - delay = 8 + delay = 10 e_cost = 10 /obj/item/ammo_casing/energy/wormhole diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index a90eda4508f..2833f2de7f5 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -31,8 +31,9 @@ var/turf/curloc = user.loc if (!istype(targloc) || !istype(curloc) || !BB) return 0 - if(targloc == curloc) //Fire the projectile - user.bullet_act(BB) + if(targloc == curloc) + if(BB.original == user) //if we target ourselves we go straight to bullet_act() + user.bullet_act(BB) del(BB) return 1 BB.loc = get_turf(user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4ff0cfff93c..dc411940f0d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -94,9 +94,10 @@ /obj/item/projectile/Bump(atom/A, yes) if(!yes) //prevents double bumps. return - if(A == firer || A == src) - loc = A.loc - return 0 //cannot shoot yourself + if(firer) + if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech + loc = A.loc + return 0 var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. @@ -134,7 +135,7 @@ if((!( current ) || loc == current)) current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) step_towards(src, current) - if((original && original.layer>=2.75) || ismob(original)) + if(original && (original.layer>=2.75) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) Bump(original, 1) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 1e0034644f4..87f2acf69c3 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -204,29 +204,31 @@ obj/item/projectile/kinetic/New() icon_state = "plasmacutter" damage_type = BRUTE damage = 5 - range = 1 + range = 3 /obj/item/projectile/plasma/New() var/turf/proj_turf = get_turf(src) if(!istype(proj_turf, /turf)) return var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure < 30) - name = "full strength plasma blast" - damage *= 3 - range += 3 + if(environment) + var/pressure = environment.return_pressure() + if(pressure < 30) + name = "full strength plasma blast" + damage *= 3 ..() /obj/item/projectile/plasma/on_hit(atom/target) + . = ..() if(istype(target, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target M.gets_drilled(firer) - return ..() + range = max(range - 1, 1) + return -1 /obj/item/projectile/plasma/adv - range = 2 + range = 5 /obj/item/projectile/plasma/adv/mech damage = 10 - range = 3 + range = 6 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 8c4de4c0cd5..edfd038e960 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -544,7 +544,7 @@ if(volume >= 3) if(!istype(T, /turf/space)) var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) - reagentdecal.reagents.add_reagent("uranium", volume) + reagentdecal.reagents.add_reagent("radium", volume) /datum/reagent/sterilizine name = "Sterilizine" diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 8ca566a7661..0f657da38b0 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -210,7 +210,7 @@ build_path = /obj/item/weapon/circuitboard/arcade/orion_trail category = list("Computer Boards") -/datum/design/orion_trail +/datum/design/slot_machine name = "Computer Design (Slot Machine)" desc = "Allows for the construction of circuit boards used to build a new slot machine." id = "slotmachine" @@ -378,4 +378,4 @@ build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/libraryconsole - category = list("Computer Boards") \ No newline at end of file + category = list("Computer Boards") diff --git a/html/changelog.html b/html/changelog.html index b7c88dc2e93..3ce048bd829 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,51 @@ -->
+

07 August 2015

+

KorPhaeron updated:

+ +

Phil235 updated:

+ +

RemieRichards updated:

+ +

bustygoku updated:

+ +

phil235 updated:

+ + +

06 August 2015

+

AnturK updated:

+ +

Core0verlad updated:

+ +

KorPhaeron updated:

+ +

MrPerson updated:

+ +

05 August 2015

CoreOverload updated:

LordPidey updated:

Xhuis updated: