Pirates are split into three different ghastly crews! (#56264)

Co-authored-by: DeAndre <robustness13@hotmail.com>
Co-authored-by: itseasytosee <55666666+itseasytosee@users.noreply.github.com>
Co-authored-by: tgstation-server <tgstation-server@tgstation13.org>
Co-authored-by: Aleksej Komarov <stylemistake@gmail.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
This commit is contained in:
tralezab
2021-02-14 16:55:37 -08:00
committed by GitHub
co-authored by DeAndre itseasytosee tgstation-server Aleksej Komarov Mothblocks
parent 0f435d5dff
commit e09101cb4b
39 changed files with 3701 additions and 89 deletions
+40 -7
View File
@@ -349,6 +349,9 @@
/area/shuttle/pirate)
"aD" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/shuttle/pirate)
"aF" = (
@@ -428,6 +431,9 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/shuttle/pirate)
"aO" = (
@@ -789,15 +795,16 @@
/turf/open/floor/plating,
/area/shuttle/pirate)
"bP" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plating,
/area/shuttle/pirate)
"bQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
/turf/open/floor/plating,
/area/shuttle/pirate)
"bX" = (
@@ -914,6 +921,9 @@
/obj/item/grenade/smokebomb{
pixel_x = 5
},
/obj/structure/sign/poster/contraband/bountyhunters{
pixel_y = 32
},
/turf/open/floor/pod/light,
/area/shuttle/pirate)
"ep" = (
@@ -1087,10 +1097,25 @@
/obj/effect/mapping_helpers/airlock/cutaiwire,
/turf/open/floor/wood,
/area/shuttle/pirate)
"Gk" = (
"ED" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/suit_storage_unit/pirate,
/obj/effect/decal/cleanable/dirt,
/obj/structure/tank_dispenser/oxygen,
/turf/open/floor/plating,
/area/shuttle/pirate)
"Gk" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/shower{
name = "decontamination shower";
pixel_y = 12
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/window{
dir = 4
},
/obj/machinery/door/window{
name = "Decontamination"
},
/turf/open/floor/plating,
/area/shuttle/pirate)
"JT" = (
@@ -1112,6 +1137,14 @@
},
/turf/open/floor/pod/light,
/area/shuttle/pirate)
"Ni" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
/turf/open/floor/plating,
/area/shuttle/pirate)
"Oe" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/obj/effect/turf_decal/tile/bar,
@@ -1274,7 +1307,7 @@ yi
aj
aj
Gk
aS
Ni
aF
aI
aJ
@@ -1381,7 +1414,7 @@ aj
yi
aj
aj
Gk
ED
aS
bZ
bo
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+8
View File
@@ -648,6 +648,14 @@
suffix = "default"
name = "pirate ship (Default)"
/datum/map_template/shuttle/pirate/silverscale
suffix = "silverscale"
name = "pirate ship (Silver Scales)"
/datum/map_template/shuttle/pirate/dutchman
suffix = "dutchman"
name = "pirate ship (Flying Dutchman)"
/datum/map_template/shuttle/hunter/space_cop
suffix = "space_cop"
name = "Police Spacevan"
+4
View File
@@ -55,6 +55,10 @@
name = "Pirate Shuttle"
requires_power = TRUE
/area/shuttle/pirate/flying_dutchman
name = "Flying Dutchman"
requires_power = FALSE
////////////////////////////Bounty Hunter Shuttles////////////////////////////
/area/shuttle/hunter
@@ -0,0 +1,60 @@
/obj/item/stack/cannonball
name = "cannonballs"
desc = "A stack of heavy plasteel cannonballs. Gunnery for the space age!"
icon_state = "cannonballs"
max_amount = 14
singular_name = "cannonball"
merge_type = /obj/item/stack/cannonball
throwforce = 10
flags_1 = CONDUCT_1
custom_materials = list(/datum/material/alloy/plasteel=MINERAL_MATERIAL_AMOUNT)
resistance_flags = FIRE_PROOF
throw_speed = 5
throw_range = 3
///the type of projectile this type of cannonball item turns into.
var/obj/projectile/projectile_type = /obj/projectile/bullet/cannonball
/obj/item/stack/cannonball/update_icon_state()
if(amount == 1)
icon_state = "[initial(icon_state)]"
else
icon_state = "[initial(icon_state)]_[min(amount, 14)]"
/obj/item/stack/cannonball/fourteen
amount = 14
/obj/item/stack/cannonball/shellball
name = "explosive shellballs"
singular_name = "explosive shellball"
desc = "An explosive anti-materiel and counter-battery projectile cannonball. Makes great work out of any wall, for easy entrances."
color = "#FF0000"
merge_type = /obj/item/stack/cannonball/shellball
projectile_type = /obj/projectile/bullet/cannonball/explosive
/obj/item/stack/cannonball/shellball/seven
amount = 7
/obj/item/stack/cannonball/shellball/fourteen
amount = 14
/obj/item/stack/cannonball/emp
name = "malfunction shots"
singular_name = "malfunction shot"
icon_state = "emp_cannonballs"
desc = "A shot filled with two chambers that combine on impact, creating a chemical EMP. What does any of that mean? Who knows. Modern piracy really lost its soul with these newfangled things."
max_amount = 4
merge_type = /obj/item/stack/cannonball/emp
projectile_type = /obj/projectile/bullet/cannonball/emp
/obj/item/stack/cannonball/the_big_one
name = "\"The Biggest Ones\""
singular_name = "\"The Biggest One\""
desc = "An insane amount of explosives jammed into a massive cannonball. The last cannonball you'll ever fire in a fight, mostly because there'll be nothing left to shoot at afterwards."
max_amount = 5
icon_state = "biggest_cannonballs"
merge_type = /obj/item/stack/cannonball/the_big_one
projectile_type = /obj/projectile/bullet/cannonball/biggest_one
/obj/item/stack/cannonball/the_big_one/five
amount = 5
+14
View File
@@ -81,6 +81,20 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.visible_message("<span class='suicide'>[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return(BRUTELOSS)
//statistically similar to e-cutlasses
/obj/item/claymore/cutlass
name = "cutlass"
desc = "A piratey sword used by buckaneers to \"negotiate\" the transfer of treasure."
icon_state = "cutlass"
inhand_icon_state = "cutlass"
worn_icon_state = "cutlass"
slot_flags = ITEM_SLOT_BACK
force = 30
throwforce = 20
throw_speed = 3
throw_range = 5
armour_penetration = 35
/obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS
desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim."
flags_1 = CONDUCT_1
+103
View File
@@ -0,0 +1,103 @@
/obj/structure/cannon
name = "cannon"
desc = "Holemaker Deluxe: A sporty model with a good stop power. Any cannon enthusiast should be expected to start here."
density = TRUE
anchored = TRUE
icon_state = "falconet_patina"
max_integrity = 300
var/obj/item/stack/cannonball/loaded_cannonball = null
var/charge_ignited = FALSE
var/fire_delay = 15
var/charge_size = 15
var/fire_sound = 'sound/weapons/gun/general/cannon.ogg'
/obj/structure/cannon/Initialize()
. = ..()
create_reagents(charge_size)
/obj/structure/cannon/proc/fire()
for(var/mob/shaken_mob in urange(10, src))
if(shaken_mob.stat == CONSCIOUS)
shake_camera(shaken_mob, 3, 1)
playsound(src, fire_sound, 50, TRUE)
if(loaded_cannonball)
var/obj/projectile/fired_projectile = new loaded_cannonball.projectile_type(get_turf(src))
QDEL_NULL(loaded_cannonball)
fired_projectile.firer = src
fired_projectile.fired_from = src
fired_projectile.fire(dir2angle(dir))
reagents.remove_all()
charge_ignited = FALSE
/obj/structure/cannon/attackby(obj/item/W, mob/user, params)
if(charge_ignited)
to_chat(user, "<span class='danger'>[src] is about to fire!</span>")
return
var/ignition_message = W.ignition_effect(src, user)
if(istype(W, /obj/item/stack/cannonball))
if(loaded_cannonball)
to_chat(user, "<span class='warning'>[src] is already loaded!</span>")
else
var/obj/item/stack/cannonball/cannoneers_balls = W
loaded_cannonball = new cannoneers_balls.type(src, 1)
loaded_cannonball.copy_evidences(cannoneers_balls)
to_chat(user, "<span class='notice'>You load a [cannoneers_balls.singular_name] into [src].</span>")
cannoneers_balls.use(1, transfer = TRUE)
return
else if(ignition_message)
if(!reagents.has_reagent(/datum/reagent/gunpowder,15))
to_chat(user, "<span class='warning'>[src] needs at least 15u of gunpowder to fire!</span>")
return
visible_message(ignition_message)
log_game("Cannon fired by [key_name(user)] in [AREACOORD(src)]")
addtimer(CALLBACK(src, .proc/fire), fire_delay)
charge_ignited = TRUE
return
else if(istype(W, /obj/item/reagent_containers))
var/obj/item/reagent_containers/powder_keg = W
if(!(powder_keg.reagent_flags & OPENCONTAINER))
return ..()
if(istype(powder_keg, /obj/item/reagent_containers/glass/rag))
return ..()
if(!powder_keg.reagents.total_volume)
to_chat(user, "<span class='warning'>[powder_keg] is empty!</span>")
return
else if(!powder_keg.reagents.has_reagent(/datum/reagent/gunpowder, charge_size))
to_chat(user, "<span class='warning'>[powder_keg] doesn't have at least 15u of gunpowder to fill [src]!</span>")
return
if(reagents.has_reagent(/datum/reagent/gunpowder, charge_size))
to_chat(user, "<span class='warning'>[src] already contains a full charge of powder! It would be unwise to add more.</span>")
return
powder_keg.reagents.trans_id_to(src, /datum/reagent/gunpowder, amount = charge_size)
to_chat(user, "<span class='notice'>You load [src] with a charge of powder from [powder_keg].</span>")
return
if(W.tool_behaviour == TOOL_WRENCH)
if(default_unfasten_wrench(user, W, time = 2 SECONDS))
return
..()
/obj/item/paper/crumpled/muddy/fluff/cannon_instructions
name = "Mast of Cannon's Past's Cannon Instructions"
desc = "A quickly written note detailing the basics of firing a cannon. Who wrote this?"
info = @{"
Ye don't know how to load cannon, and ye call yerself a fearsome pirate? I think ye be more alike a space sailor under the space monarchy's flag! Alas, everyone must learn how to blast holes in enemy ships. And thus:<br>
<br><center><b>HOW YE FIRES A CANNON:</b><br></center>
BE STEP ONE: LOAD THE LEAD BALL O' YE CHOICE!<br>
BE STEP TWO: LOAD 15U PIRATE STANDARD CHARGE O' GUNPOWDER!<br>
BE STEP THREE: LIGHT THE FUSE WITH SOMETHING, AND LET ER' RIP!<br>
<br><center><b>CANNONBALL TYPES:</b><br></center>
REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any limb it hits, and most certainly down anyone hit in the chest! If they are not directly hit, they will be at least hurt by the shrapnel!<br>
EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!<br>
MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!<br>
THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned!
"}
@@ -566,6 +566,8 @@
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
///Pirates
/obj/effect/mob_spawn/human/pirate
name = "space pirate sleeper"
desc = "A cryo sleeper smelling faintly of rum."
@@ -573,7 +575,6 @@
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
mob_name = "a space pirate"
mob_species = /datum/species/skeleton
outfit = /datum/outfit/pirate/space
roundstart = FALSE
death = FALSE
@@ -583,28 +584,82 @@
short_desc = "You are a space pirate."
flavour_text = "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot."
assignedrole = "Space Pirate"
var/rank = "Mate"
///Rank of the pirate on the ship, it's used in generating pirate names!
var/rank = "Deserter"
///Whether or not it will spawn a fluff structure upon opening.
var/spawn_oldpod = TRUE
/obj/effect/mob_spawn/human/pirate/special(mob/living/new_spawn)
new_spawn.fully_replace_character_name(new_spawn.real_name,generate_pirate_name())
new_spawn.fully_replace_character_name(new_spawn.real_name, generate_pirate_name(new_spawn.gender))
new_spawn.mind.add_antag_datum(/datum/antagonist/pirate)
/obj/effect/mob_spawn/human/pirate/proc/generate_pirate_name()
/obj/effect/mob_spawn/human/pirate/proc/generate_pirate_name(spawn_gender)
var/beggings = strings(PIRATE_NAMES_FILE, "beginnings")
var/endings = strings(PIRATE_NAMES_FILE, "endings")
return "[rank] [pick(beggings)][pick(endings)]"
/obj/effect/mob_spawn/human/pirate/Destroy()
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
if(spawn_oldpod)
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
/obj/effect/mob_spawn/human/pirate/captain
rank = "Captain"
outfit = /datum/outfit/pirate/space/captain
rank = "Renegade Leader"
outfit = /datum/outfit/pirate/captain
/obj/effect/mob_spawn/human/pirate/gunner
rank = "Rogue"
/obj/effect/mob_spawn/human/pirate/skeleton
name = "pirate remains"
desc = "Some unanimated bones. They feel like they could spring to life any moment!"
random = TRUE
density = FALSE
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
spawn_oldpod = FALSE
mob_name = "a space pirate"
mob_species = /datum/species/skeleton
outfit = /datum/outfit/pirate
rank = "Mate"
/obj/effect/mob_spawn/human/pirate/skeleton/captain
rank = "Captain"
outfit = /datum/outfit/pirate/captain
/obj/effect/mob_spawn/human/pirate/skeleton/gunner
rank = "Gunner"
/obj/effect/mob_spawn/human/pirate/silverscale
name = "elegant sleeper"
desc = "Cozy. You get the feeling you aren't supposed to be here, though..."
random = TRUE
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
mob_name = "a space pirate"
mob_species = /datum/species/lizard/silverscale
outfit = /datum/outfit/pirate/silverscale
rank = "High-born"
/obj/effect/mob_spawn/human/pirate/silverscale/generate_pirate_name(spawn_gender)
var/first_name
switch(gender)
if(MALE)
first_name = pick(GLOB.lizard_names_male)
if(FEMALE)
first_name = pick(GLOB.lizard_names_female)
else
first_name = pick(GLOB.lizard_names_male + GLOB.lizard_names_female)
return "[rank] [first_name]-Silverscale"
/obj/effect/mob_spawn/human/pirate/silverscale/captain
rank = "Old-guard"
outfit = /datum/outfit/pirate/silverscale/captain
/obj/effect/mob_spawn/human/pirate/silverscale/gunner
rank = "Top-drawer"
//Forgotten syndicate ship
/obj/effect/mob_spawn/human/syndicatespace
+2
View File
@@ -550,6 +550,8 @@ Moving interrupts
return ..()
/obj/structure/statue/custom/proc/set_visuals(model_appearance)
if(content_ma)
QDEL_NULL(content_ma)
content_ma = new
content_ma.appearance = model_appearance
content_ma.pixel_x = 0
+10
View File
@@ -152,6 +152,11 @@
user.remove_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT)
to_chat(user, "<span class='boldnotice'>You can no longer speak like a pirate.</span>")
/obj/item/clothing/head/pirate/armored
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
equip_delay_other = 20
/obj/item/clothing/head/pirate/captain
name = "pirate captain hat"
icon_state = "hgpiratecap"
@@ -164,6 +169,11 @@
inhand_icon_state = "bandana"
dynamic_hair_suffix = ""
/obj/item/clothing/head/bandana/armored
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
equip_delay_other = 20
/obj/item/clothing/head/bowler
name = "bowler-hat"
desc = "Gentleman, elite aboard!"
+50 -13
View File
@@ -121,33 +121,70 @@
uniform = /obj/item/clothing/under/costume/pirate
shoes = /obj/item/clothing/shoes/sneakers/brown
suit = /obj/item/clothing/suit/pirate
head = /obj/item/clothing/head/bandana
suit = /obj/item/clothing/suit/pirate/armored
head = /obj/item/clothing/head/bandana/armored
ears = /obj/item/radio/headset/syndicate
glasses = /obj/item/clothing/glasses/eyepatch
/datum/outfit/pirate/post_equip(mob/living/carbon/human/equipped)
equipped.faction |= "pirate"
var/obj/item/radio/outfit_radio = equipped.ears
if(outfit_radio)
outfit_radio.set_frequency(FREQ_SYNDICATE)
outfit_radio.freqlock = TRUE
var/obj/item/card/id/outfit_id = equipped.wear_id
if(outfit_id)
outfit_id.registered_name = equipped.real_name
outfit_id.update_label()
/datum/outfit/pirate/captain
name = "Space Pirate Captain"
head = /obj/item/clothing/head/pirate/armored
/datum/outfit/pirate/space
name = "Space Pirate (EVA)"
suit = /obj/item/clothing/suit/space/pirate
head = /obj/item/clothing/head/helmet/space/pirate/bandana
mask = /obj/item/clothing/mask/breath
suit_store = /obj/item/tank/internals/oxygen
ears = /obj/item/radio/headset/syndicate
id = /obj/item/card/id
/datum/outfit/pirate/space/captain
name = "Space Pirate Captain (EVA)"
head = /obj/item/clothing/head/helmet/space/pirate
/datum/outfit/pirate/post_equip(mob/living/carbon/human/H)
H.faction |= "pirate"
/datum/outfit/pirate/silverscale
name = "Silver Scale Member"
var/obj/item/radio/R = H.ears
if(R)
R.set_frequency(FREQ_SYNDICATE)
R.freqlock = TRUE
head = /obj/item/clothing/head/collectable/tophat
glasses = /obj/item/clothing/glasses/monocle
uniform = /obj/item/clothing/under/suit/charcoal
shoes = /obj/item/clothing/shoes/laceup
suit = /obj/item/clothing/suit/armor/vest/alt
gloves = /obj/item/clothing/gloves/color/black
var/obj/item/card/id/W = H.wear_id
if(W)
W.registered_name = H.real_name
W.update_label()
id = /obj/item/card/id/silver
///special fluff for the ID's job
var/scale_assignment = "Silver Scale Member"
/datum/outfit/pirate/silverscale/post_equip(mob/living/carbon/human/equipped)
..()
var/obj/item/card/id/outfit_id = equipped.wear_id
if(outfit_id)
outfit_id.assignment = scale_assignment
outfit_id.update_label()
/datum/outfit/pirate/silverscale/captain
mask = /obj/item/clothing/mask/cigarette/cigar/havana
l_pocket = /obj/item/lighter
head = /obj/item/clothing/head/crown
scale_assignment = "Silver Scale VIP"
/datum/outfit/tunnel_clown
name = "Tunnel Clown"
@@ -131,28 +131,23 @@ Contains:
//Space pirate outfit
/obj/item/clothing/head/helmet/space/pirate
name = "pirate hat"
desc = "Yarr."
icon_state = "pirate"
inhand_icon_state = "pirate"
name = "modified EVA helmet"
desc = "A modified helmet to allow space pirates to intimidate their customers whilst staying safe from the void. Comes with some additional protection."
icon_state = "spacepirate"
inhand_icon_state = "spacepiratehelmet"
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
flags_inv = HIDEHAIR
strip_delay = 40
equip_delay_other = 20
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/helmet/space/pirate/bandana
name = "pirate bandana"
icon_state = "bandana"
inhand_icon_state = "bandana"
icon_state = "spacebandana"
inhand_icon_state = "spacepiratehelmet"
/obj/item/clothing/suit/space/pirate
name = "pirate coat"
desc = "Yarr."
icon_state = "pirate"
inhand_icon_state = "pirate"
name = "modified EVA suit"
desc = "A modified suit to allow space pirates to board shuttles and stations while avoiding the maw of the void. Comes with additional protection, and is lighter to move in."
icon_state = "spacepirate"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = 0
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
slowdown = 0
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
@@ -54,12 +54,22 @@
allowed = list(/obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/pirate/armored
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
equip_delay_other = 20
/obj/item/clothing/suit/pirate/captain
name = "pirate captain coat"
desc = "Yarr."
icon_state = "hgpirate"
inhand_icon_state = "hgpirate"
/obj/item/clothing/suit/pirate/captain/armored
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
equip_delay_other = 20
/obj/item/clothing/suit/cyborg_suit
name = "cyborg suit"
+31 -5
View File
@@ -7,6 +7,10 @@
earliest_start = 30 MINUTES
gamemode_blacklist = list("nuclear")
#define PIRATES_ROGUES "Rogues"
#define PIRATES_SILVERSCALES "Silverscales"
#define PIRATES_DUTCHMAN "Flying Dutchman"
/datum/round_event_control/pirates/preRunEvent()
if (!SSmapping.empty_space)
return EVENT_CANT_RUN
@@ -19,11 +23,20 @@
var/payoff = 0
var/payoff_min = 20000
var/paid_off = FALSE
var/pirate_type
var/ship_template
var/ship_name = "Space Privateers Association"
var/shuttle_spawned = FALSE
/datum/round_event/pirates/setup()
ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
pirate_type = pick(PIRATES_ROGUES, PIRATES_SILVERSCALES, PIRATES_DUTCHMAN)
switch(pirate_type)
if(PIRATES_ROGUES)
ship_name = pick(strings(PIRATE_NAMES_FILE, "rogue_names"))
if(PIRATES_SILVERSCALES)
ship_name = pick(strings(PIRATE_NAMES_FILE, "silverscale_names"))
if(PIRATES_DUTCHMAN)
ship_name = "Flying Dutchman"
/datum/round_event/pirates/announce(fake)
priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", SSstation.announcer.get_rand_report_sound())
@@ -33,9 +46,22 @@
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
payoff = max(payoff_min, FLOOR(D.account_balance * 0.80, 1000))
threat.title = "Business proposition"
threat.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank."
threat.possible_answers = list("We'll pay.","No way.")
switch(pirate_type)
if(PIRATES_ROGUES)
ship_template = /datum/map_template/shuttle/pirate/default
threat.title = "Sector protection offer"
threat.content = "Greetings from the [ship_name]. Your sector needs protection, how about you pay us [payoff] credits, or else you may be left wide open to an attack."
threat.possible_answers = list("We'll pay.","That sounds like a scam.")
if(PIRATES_SILVERSCALES)
ship_template = /datum/map_template/shuttle/pirate/silverscale
threat.title = "Tribute to high society"
threat.content = "This is the [ship_name]. The Silver Scales wish for some tribute from your plebeian lizards. [payoff] credits should do the trick."
threat.possible_answers = list("We'll pay.","Tribute? Really? Go away.")
if(PIRATES_DUTCHMAN)
ship_template = /datum/map_template/shuttle/pirate/dutchman
threat.title = "Business proposition"
threat.content = "Ahoy! This be the [ship_name]. Cough up [payoff] credits or you'll walk the plank."
threat.possible_answers = list("We'll pay.","We will not be extorted.")
threat.answer_callback = CALLBACK(src,.proc/answered)
SScommunications.send_message(threat,unique = TRUE)
@@ -67,7 +93,7 @@
var/list/candidates = pollGhostCandidates("Do you wish to be considered for pirate crew?", ROLE_TRAITOR)
shuffle_inplace(candidates)
var/datum/map_template/shuttle/pirate/default/ship = new
var/datum/map_template/shuttle/pirate/ship = new ship_template
var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
var/z = SSmapping.empty_space.z_value
+22 -9
View File
@@ -8,6 +8,7 @@
pressure_resistance = 2 * ONE_ATMOSPHERE
max_integrity = 300
var/open = FALSE
var/can_open = TRUE
var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better.
/obj/structure/fermenting_barrel/Initialize()
@@ -57,15 +58,16 @@
return ..()
/obj/structure/fermenting_barrel/attack_hand(mob/user)
open = !open
if(open)
reagents.flags &= ~(DRAINABLE)
reagents.flags |= REFILLABLE | TRANSPARENT
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
else
reagents.flags |= DRAINABLE
reagents.flags &= ~(REFILLABLE | TRANSPARENT)
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
if(can_open)
open = !open
if(open)
reagents.flags &= ~(DRAINABLE)
reagents.flags |= REFILLABLE | TRANSPARENT
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
else
reagents.flags |= DRAINABLE
reagents.flags &= ~(REFILLABLE | TRANSPARENT)
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
update_icon()
/obj/structure/fermenting_barrel/update_icon_state()
@@ -80,3 +82,14 @@
reqs = list(/obj/item/stack/sheet/mineral/wood = 8)
time = 50
category = CAT_PRIMAL
//lil gunpowder barrel fer pirates since it's a nice reagent holder
/obj/structure/fermenting_barrel/gunpowder
name = "gunpowder barrel"
desc = "A large wooden barrel for holding gunpowder. You'll need to take from this to load the cannons."
can_open = FALSE
/obj/structure/fermenting_barrel/gunpowder/Initialize()
. = ..()
reagents.add_reagent(/datum/reagent/gunpowder, 250)
+7
View File
@@ -272,6 +272,13 @@ Key procs
/datum/language_holder/lizard/ash
selected_language = /datum/language/draconic
/datum/language_holder/lizard/silver
understood_languages = list(/datum/language/uncommon = list(LANGUAGE_ATOM),
/datum/language/draconic = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/uncommon = list(LANGUAGE_ATOM),
/datum/language/draconic = list(LANGUAGE_ATOM))
selected_language = /datum/language/uncommon
/datum/language_holder/monkey
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
/datum/language/monkey = list(LANGUAGE_ATOM))
@@ -1298,6 +1298,9 @@
/mob/living/carbon/human/species/lizard/ashwalker
race = /datum/species/lizard/ashwalker
/mob/living/carbon/human/species/lizard/silverscale
race = /datum/species/lizard/silverscale
/mob/living/carbon/human/species/ethereal
race = /datum/species/ethereal
@@ -111,3 +111,38 @@ Lizard subspecies: ASHWALKERS
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,HAS_FLESH,HAS_BONE)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
species_language_holder = /datum/language_holder/lizard/ash
/*
Lizard subspecies: SILVER SCALED
*/
/datum/species/lizard/silverscale
name = "Silver Scale"
id = "silverlizard"
limbs_id = "lizard"
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_HOLY,TRAIT_NOBREATH,TRAIT_VIRUSIMMUNE,TRAIT_WINE_TASTER)
species_language_holder = /datum/language_holder/lizard/silver
mutanttongue = /obj/item/organ/tongue/lizard/silver
armor = 10 //very light silvery scales soften blows
changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN
///stored mutcolor for when we turn back off of a silverscale.
var/old_mutcolor
///stored eye color for when we turn back off of a silverscale.
var/old_eyecolor
/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/C, datum/species/old_species)
var/mob/living/carbon/human/new_silverscale = C
old_mutcolor = C.dna.features["mcolor"]
old_eyecolor = new_silverscale.eye_color
new_silverscale.dna.features["mcolor"] = "eeeeee"
new_silverscale.eye_color = "0000a0"
..()
new_silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2))
/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/C)
var/mob/living/carbon/human/was_silverscale = C
was_silverscale.dna.features["mcolor"] = old_mutcolor
was_silverscale.eye_color = old_eyecolor
was_silverscale.remove_filter("silver_glint")
..()
+5 -4
View File
@@ -124,12 +124,13 @@
/obj/projectile/beam/pulse/heavy
name = "heavy pulse laser"
icon_state = "pulse1_bl"
var/life = 20
projectile_piercing = ALL
var/pierce_hits = 2
/obj/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = FALSE)
life -= 10
if(life > 0)
. = BULLET_ACT_FORCE_PIERCE
if(pierce_hits <= 0)
projectile_piercing = NONE
pierce_hits -= 1
..()
/obj/projectile/beam/emitter
@@ -0,0 +1,58 @@
/obj/projectile/bullet/cannonball
name = "cannonball"
icon_state = "cannonball"
damage = 110 //gets set to 100 before first mob impact.
sharpness = NONE
wound_bonus = 0
projectile_piercing = ALL
dismemberment = 0
paralyze = 5 SECONDS
stutter = 10 SECONDS
embedding = null
hitsound = 'sound/effects/meteorimpact.ogg'
hitsound_wall = 'sound/weapons/sonic_jackhammer.ogg'
/obj/projectile/bullet/cannonball/on_hit(atom/target, blocked = FALSE)
damage -= 10
if(damage < 40)
projectile_piercing = NONE //so it finishes its rampage
if(blocked == 100)
return ..()
if(isobj(target))
var/obj/hit_object = target
hit_object.take_damage(80, BRUTE, BULLET, FALSE)
else if(isclosedturf(target))
damage -= max(damage - 30, 10) //lose extra momentum from busting through a wall
var/turf/closed/hit_turf = target
hit_turf.ScrapeAway()
return ..()
/obj/projectile/bullet/cannonball/explosive
name = "explosive shell"
color = "#FF0000"
projectile_piercing = NONE
damage = 40 //set to 30 before first mob impact, but they're gonna be gibbed by the explosion
/obj/projectile/bullet/cannonball/explosive/on_hit(atom/target, blocked = FALSE)
explosion(target, 2, 3, 4)
. = ..()
/obj/projectile/bullet/cannonball/emp
name = "malfunction shot"
icon_state = "emp_cannonball"
projectile_piercing = NONE
damage = 15 //very low
/obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = FALSE)
empulse(src, 4, 10)
. = ..()
/obj/projectile/bullet/cannonball/biggest_one
name = "\"The Biggest One\""
icon_state = "biggest_one"
damage = 70 //low pierce
/obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = FALSE)
if(projectile_piercing == NONE)
explosion(target, GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE, GLOB.MAX_EX_FLASH_RANGE)
. = ..()
+78
View File
@@ -92,6 +92,84 @@
message = lizard_eckS.Replace(message, "ECKS$1")
speech_args[SPEECH_MESSAGE] = message
/obj/item/organ/tongue/lizard/silver
name = "silver tongue"
desc = "A genetic branch of the high society Silver Scales that gives them their silverizing properties. To them, it is everything, and society traitors have their tongue forcibly revoked. Oddly enough, it itself is just blue."
icon_state = "silvertongue"
actions_types = list(/datum/action/item_action/organ_action/statue)
/datum/action/item_action/organ_action/statue
name = "Become Statue"
desc = "Become an elegant silver statue. Its durability and yours are directly tied together, so make sure you're careful."
COOLDOWN_DECLARE(ability_cooldown)
var/obj/structure/statue/custom/statue
/datum/action/item_action/organ_action/statue/New(Target)
. = ..()
statue = new
RegisterSignal(statue, COMSIG_PARENT_QDELETING, .proc/statue_destroyed)
/datum/action/item_action/organ_action/statue/Destroy()
UnregisterSignal(statue, COMSIG_PARENT_QDELETING)
QDEL_NULL(statue)
. = ..()
/datum/action/item_action/organ_action/statue/Trigger()
. = ..()
if(!iscarbon(owner))
to_chat(owner, "<span class='warning'>Your body rejects the powers of the tongue!</span>")
return
var/mob/living/carbon/becoming_statue = owner
if(becoming_statue.health < 1)
to_chat(becoming_statue, "<span class='danger'>You are too weak to become a statue!</span>")
return
if(!COOLDOWN_FINISHED(src, ability_cooldown))
to_chat(becoming_statue, "<span class='warning'>You just used the ability, wait a little bit!</span>")
return
var/is_statue = becoming_statue.loc == statue
to_chat(becoming_statue, "<span class='notice'>You begin to [is_statue ? "break free from the statue" : "make a glorious pose as you become a statue"]!</span>")
if(!do_after(becoming_statue, (is_statue ? 5 : 30), target = get_turf(becoming_statue)))
to_chat(becoming_statue, "<span class='warning'>Your transformation is interrupted!</span>")
COOLDOWN_START(src, ability_cooldown, 3 SECONDS)
return
COOLDOWN_START(src, ability_cooldown, 10 SECONDS)
if(statue.name == initial(statue.name)) //statue has not been set up
statue.name = "statue of [becoming_statue.real_name]"
statue.desc = "statue depicting [becoming_statue.real_name]"
statue.set_custom_materials(list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT*5))
if(is_statue)
statue.visible_message("<span class='danger'>[statue] becomes animated!</span>")
becoming_statue.forceMove(get_turf(statue))
statue.moveToNullspace()
UnregisterSignal(becoming_statue, COMSIG_MOVABLE_MOVED)
else
becoming_statue.visible_message("<span class='notice'>[becoming_statue] hardens into a silver statue.</span>", "<span class='notice'>You have become a silver statue!</span>")
statue.set_visuals(becoming_statue.appearance)
statue.forceMove(get_turf(becoming_statue))
becoming_statue.forceMove(statue)
statue.obj_integrity = becoming_statue.health
RegisterSignal(becoming_statue, COMSIG_MOVABLE_MOVED, .proc/human_left_statue)
//somehow they used an exploit/teleportation to leave statue, lets clean up
/datum/action/item_action/organ_action/statue/proc/human_left_statue(atom/movable/mover, atom/oldloc, direction)
SIGNAL_HANDLER
statue.moveToNullspace()
UnregisterSignal(mover, COMSIG_MOVABLE_MOVED)
/datum/action/item_action/organ_action/statue/proc/statue_destroyed(datum/source)
to_chat(owner, "<span class='userdanger'>Your existence as a living creature snaps as your statue form crumbles!</span>")
if(iscarbon(owner))
//drop everything, just in case
var/mob/living/carbon/dying_carbon = owner
for(var/obj/item/dropped in dying_carbon)
if(!dying_carbon.dropItemToGround(dropped))
qdel(dropped)
qdel(owner)
/obj/item/organ/tongue/fly
name = "proboscis"
desc = "A freakish looking meat tube that apparently can take in liquids."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 KiB

After

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.
+100 -30
View File
@@ -1,31 +1,101 @@
{
"beginnings":[
"Star",
"Oort",
"Comet",
"Pulsar",
"Plasma",
"Void",
"Space",
"Solar",
"Laser",
"Ion"
],
"endings":[
"keel",
"beard",
"bilge",
"hull",
"hook",
"flag",
"deck",
"salt",
"knot",
"fish",
"helm"
],
"ship_names":[
"Space Queen's Revenge",
"Syndicate Privateer"
]
}
"beginnings":[
"Comet",
"Ion",
"Laser",
"Oort",
"Plasma",
"Pulsar",
"Solar",
"Space",
"Star",
"Void"
],
"endings":[
"beard",
"bilge",
"deck",
"fish",
"flag",
"helm",
"hook",
"hull",
"keel",
"knot",
"salt"
],
"rogue_names":[
"Abyssal Titan",
"Ashes to Ashes",
"Asteroid Blaster",
"Asteroid Dragger",
"Bellowing Spacedragon",
"Blargbeam Solar-slider",
"Blood Money",
"Cosmic Gunboat",
"Customer Service",
"Deadman's Switch",
"Diplomacy Disputer",
"Driftbeam",
"Echoing Laughter",
"Electric Boogaloo",
"Fat Leg",
"Heaven's Cavaliers",
"I Am Become Death",
"I Love the Bomb",
"Ickity Pickety Startooth Knuckle Dragger",
"John Ship",
"Lizard Melter",
"Lost in Deep Space",
"Missile Rack",
"Moth Splatterer",
"New Sins for Old",
"One Last Job",
"Paint Asteroids Red",
"Pastafarianism",
"Raging Meteor",
"Reverse Far Leap",
"Scourge of the Milky Way",
"Silicon Policy",
"Space Grease",
"Space Justice",
"Space Pearl",
"Star Scraper",
"War as a Business",
"Xenophobia",
"Space Queen's Revenge",
"Syndicate Privateer"
],
"silverscale_names":[
"Antelope's Run",
"Aristocrat's Principle",
"Aristocratic Tributary",
"Bane of Serfs",
"Benevolence of the Serpentine",
"Casus Belli",
"Celestial Lizardhawk",
"Divine Space Wind",
"Empire Sprawl",
"Guiding Hand",
"His Majesty's Chosen",
"Home Away from Home",
"Jewel of Tizira",
"Manifest Destiny",
"Necessary Evil",
"Pearly Gates",
"Pinnacle of the Stratocracy",
"Prince Regent",
"Right to Rule",
"Ruling Body",
"Serpentine Dominion",
"Silver Fox",
"Silver Sterling",
"Silverchain's Sovereignty",
"Spaceflower",
"Status Quo",
"Swords and Sandals",
"Thesaurus Terror",
"Archduke's Silver Ring",
"Silver Steed"
]
}
+3
View File
@@ -1214,6 +1214,7 @@
#include "code\game\objects\items\robot\robot_upgrades.dm"
#include "code\game\objects\items\stacks\ammonia_crystals.dm"
#include "code\game\objects\items\stacks\bscrystal.dm"
#include "code\game\objects\items\stacks\cannonballs.dm"
#include "code\game\objects\items\stacks\cash.dm"
#include "code\game\objects\items\stacks\license_plates.dm"
#include "code\game\objects\items\stacks\medical.dm"
@@ -1266,6 +1267,7 @@
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\cannon.dm"
#include "code\game\objects\structures\chess.dm"
#include "code\game\objects\structures\destructible_structures.dm"
#include "code\game\objects\structures\displaycase.dm"
@@ -2878,6 +2880,7 @@
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
#include "code\modules\projectiles\projectile\bullets\cannon.dm"
#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
#include "code\modules\projectiles\projectile\bullets\grenade.dm"