diff --git a/__DEFINES/global.dm b/__DEFINES/global.dm index e99d1c86eed..f063b1a6418 100644 --- a/__DEFINES/global.dm +++ b/__DEFINES/global.dm @@ -239,6 +239,7 @@ var/list/score=list( "foodeaten" = 0, //How much food was consumed "clownabuse" = 0, //How many times a clown was punched, struck or otherwise maligned "slips" = 0, //How many people have slipped during this round + "gunsspawned" = 0, //Guns spawned by the Summon Guns spell. Only guns, not other artifacts. "richestname" = null, //This is all stuff to show who was the richest alive on the shuttle "richestjob" = null, //Kinda pointless if you dont have a money system i guess "richestcash" = 0, @@ -248,6 +249,7 @@ var/list/score=list( "dmgestdamage" = 0, "dmgestkey" = null, "explosions" = 0, //How many explosions happened total + "deadpets" = 0, //Only counts 'special' simple_mobs, like Ian, Poly, Runtime, Sasha etc "arenafights" = 0, "arenabest" = null, diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c07c6b4ef13..b7a1747cee3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -166,6 +166,7 @@ var/mommi_static = 0 //Scrambling mobs for mommis or not var/skip_minimap_generation = 0 //If 1, don't generate minimaps + var/skip_holominimap_generation = 0 //If 1, don't generate holominimaps var/skip_vault_generation = 0 //If 1, don't generate vaults var/shut_up_automatic_diagnostic_and_announcement_system = 0 //If 1, don't play the vox sounds at the start of every shift. @@ -555,6 +556,8 @@ mommi_static = 1 if("skip_minimap_generation") skip_minimap_generation = 1 + if("skip_holominimap_generation") + skip_holominimap_generation = 1 if("skip_vault_generation") skip_vault_generation = 1 if("shut_up_automatic_diagnostic_and_announcement_system") diff --git a/code/controllers/subsystem/init/more_init_stuff.dm b/code/controllers/subsystem/init/more_init_stuff.dm index 6acc1b3830d..7d54532054c 100644 --- a/code/controllers/subsystem/init/more_init_stuff.dm +++ b/code/controllers/subsystem/init/more_init_stuff.dm @@ -20,10 +20,15 @@ var/datum/subsystem/more_init/SSmore_init create_global_parallax_icons() log_startup_progress(" Finished caching space parallax simulation in [stop_watch(watch)]s.") - watch=start_watch() - log_startup_progress("Generating holominimaps...") - generateHoloMinimaps() - log_startup_progress(" Finished holominimaps in [stop_watch(watch)]s.") + if (!config.skip_minimap_generation) + watch=start_watch() + log_startup_progress("Generating holominimaps...") + generateHoloMinimaps() + log_startup_progress(" Finished holominimaps in [stop_watch(watch)]s.") + else + holomaps_initialized = 1 //Assume holominimaps were prerendered, the worst thing that happens if they're missing is that the minimap consoles don't show a minimap + log_startup_progress("Not generating holominimaps - SKIP_HOLOMINIMAP_GENERATION found in config/config.txt") + ..() buildcamlist() diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index fbb423a2938..f4a0cbefe52 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -21,6 +21,7 @@ var/mind=null var/list/languages = list() var/times_cloned=0 + var/talkcount /datum/dna2/record/proc/GetData() var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 6d103eff502..f6a257767a7 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -2,7 +2,7 @@ var/datum/controller/gameticker/ticker /datum/controller/gameticker var/remaining_time = 0 - var/const/restart_timeout = 600 + var/const/restart_timeout = 60 SECONDS var/current_state = GAME_STATE_PREGAME var/hide_mode = 0 @@ -425,6 +425,7 @@ var/datum/controller/gameticker/ticker spawn declare_completion() + end_credits.on_roundend() if(config.map_voting) //testing("Vote picked [chosen_map]") vote.initiate_vote("map","The Server", popup = 1, weighted_vote = config.weighted_votes) @@ -465,14 +466,14 @@ var/datum/controller/gameticker/ticker if (watchdog.waiting) to_chat(world, "Server will shut down for an automatic update in [config.map_voting ? "[(restart_timeout/10)] seconds." : "a few seconds."]") if(config.map_voting) - sleep(restart_timeout) //waiting for a mapvote to end + sleep(restart_timeout - end_credits.starting_delay) //waiting for a mapvote to end if(!delay_end) watchdog.signal_ready() else to_chat(world, "An admin has delayed the round end") delay_end = 2 else if(!delay_end) - sleep(restart_timeout) + sleep(restart_timeout - end_credits.starting_delay) if(!delay_end) CallHook("Reboot",list()) world.Reboot() diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 8ea19f81885..07190a673e9 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -221,6 +221,10 @@ continue score["litter"]++ + for(var/mob/living/simple_animal/SA in dead_mob_list) + if(SA.is_pet) + score["deadpets"]++ + //Bonus Modifiers //var/traitorwins = score["traitorswon"] var/deathpoints = score["deadcrew"] * 250 //Human beans aren't free diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 7514a9d230c..1c618708913 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -142,6 +142,7 @@ if("bulletstorm") new /obj/item/weapon/gun/bulletstorm(get_turf(src)) playsound(src,'sound/effects/summon_guns.ogg', 50, 1) + score["gunsspawned"]++ /mob/living/carbon/human/proc/equip_swords() var/randomizeswords = pick("unlucky", "misc", "throw", "armblade", "pickaxe", "pcutter", "esword", "alt-esword", "machete", "kitchen", "medieval", "katana", "axe", "boot", "saw", "scalpel", "switchtool", "shitcurity") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f1256d3c8b4..3887dea5250 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1501,3 +1501,52 @@ proc/formatPlayerPanel(var/mob/U,var/text="PP") tomob.ckey = frommob.ckey qdel(frommob) return 1 + +/datum/admins/proc/CreditsPanel() + if(!check_rights(0)) + return + + var/dat = "
Credits Panel

" + dat += "
Episode Name:
" + dat += "Chosen Name: [end_credits.episode_name == "" ? "(Will Generate Automatically)" : end_credits.episode_name] (Set) " + if(end_credits.episode_name != "" && !end_credits.generated) + dat += "(Reset)" + else if(end_credits.generated) + dat += "(Reroll!)" + dat += "
" + if(!end_credits.generated) + dat += "The round isn't over, so the name possibilities haven't been drafted yet.
You can manually write down a set name now, or come back when the round ends.
" + else + dat += "Drafted Name Possibilities: " + dat += "
" + for(var/datum/episode_name/N in end_credits.episode_names) + dat += "[N.make_div(src)]
" + dat += "
" + dat += "
" + dat += "
Disclaimers:
" + if(!end_credits.generated) + dat += "The round isn't over, so the disclaimers haven't been generated yet.
You can add some now (they will show up at the top), or come back when the round ends.
" + dat += "
Generated Disclaimers: " + dat += "
" + dat += "(Add New)
" + for(var/i = 1; i <= end_credits.disclaimers.len; i++) + var/disclaimer = end_credits.disclaimers[i] + if(i > 1) + dat += "" + else + dat += " " + if(i < end_credits.disclaimers.len) + dat += "" + else + dat += " " + dat += " (Edit) " + if(findtext(disclaimer, "' at the end if you want extra spacing.","New Disclaimer") as message|null + if(newdisclaimer) + end_credits.disclaimers.Insert(1,newdisclaimer) + log_admin("[key_name(usr)] added a new disclaimer to the current round's credits: '[newdisclaimer]'") + message_admins("[key_name_admin(usr)] added a new disclaimer to the current round's credits: '[newdisclaimer]'") + if("editdisclaimer") + var/i = text2num(href_list["disclaimerindex"]) + var/olddisclaimer = end_credits.disclaimers[i] + var/newdisclaimer = input(usr,"Write a new rolling disclaimer.","Edit Disclaimer",olddisclaimer) as message|null + if(newdisclaimer) + log_admin("[key_name(usr)] edited a rolling credits disclaimer. New disclaimer: '[newdisclaimer]'") + message_admins("[key_name_admin(usr)] edited a rolling credits disclaimer. New disclaimer: '[newdisclaimer]'") + end_credits.disclaimers[i] = newdisclaimer + if("disclaimerup") + var/i = text2num(href_list["disclaimerindex"]) + if(i > 1) + end_credits.disclaimers.Swap(i,i-1) + if("disclaimerdown") + var/i = text2num(href_list["disclaimerindex"]) + if(i < end_credits.disclaimers.len) + end_credits.disclaimers.Swap(i,i+1) + + CreditsPanel() //refresh! + + // ----- Religion and stuff if (href_list["religions"]) #define MAX_MSG_LENGTH 200 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index fa9ebef80d4..77d405306ea 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -185,6 +185,7 @@ prefs.client = src prefs.initialize_preferences(client_login = 1) + . = ..() //calls mob.Login() chatOutput.start() @@ -215,6 +216,8 @@ //Set map label to correct map name winset(src, "rpane.map", "text=\"[map.nameLong]\"") + clear_credits() //Otherwise these persist if the client doesn't close the game between rounds + // Notify scanners. INVOKE_EVENT(on_login,list( "client"=src, diff --git a/code/modules/credits/credit_disclaimers.dm b/code/modules/credits/credit_disclaimers.dm new file mode 100644 index 00000000000..9d690ae96f5 --- /dev/null +++ b/code/modules/credits/credit_disclaimers.dm @@ -0,0 +1,25 @@ +/datum/credits/proc/draft_disclaimers() + var/inline_images = "" + for(var/filename in flist("icons/credits/")) + var/icon/I = icon("icons/credits/[filename]") + inline_images += "" + + disclaimers += "Filmed on Location at [station_name()]." + disclaimers += "Filmed with BYOND© cameras and lenses. Outer space footage provided by NASA." + disclaimers += "Additional special visual effects by LUMMOX® JR. Motion Picture Productions." + disclaimers += "Unofficially Sponsored by The United States Navy." + disclaimers += "All rights reserved." + disclaimers += "
" + disclaimers += pick("All stunts were performed by underpaid and expendable interns. Do NOT try at home.", "[director] do not endorse behaviour depicted. Attempt at your own risk.") + if(score["deadpets"] == 0) + disclaimers += "No animals were harmed in the making of this film.[(score["clownabuse"] > 50) ? " However, many clowns were." : ""]" + else if(score["clownabuse"] == 0) + disclaimers += "No clowns were harmed in the making of this film." + else if(score["clownabuse"] > 50) + disclaimers += "All clowns were harmed in the making of this film." + disclaimers += "
" + disclaimers += inline_images + disclaimers += "
" + disclaimers += "This motion picture is (not) protected under the copyright laws of the United States and all countries throughout the universe. Country of first publication: United States of America. Any unauthorized exhibition, distribution, or copying of this picture or any part thereof (including soundtrack) is an infringement of the relevant copyright and will subject the infringer to civil liability and criminal prosecution." + disclaimers += "The story, all names, characters, and incidents portrayed in this production are fictitious. No identification with actual persons (living or deceased), places, buildings, and products is intended or should be inferred." + disclaimers += "No person or entity associated with this film received payment or anything of value, or entered into any agreement, in connection with the depiction of tobacco products." diff --git a/code/modules/credits/credits.dm b/code/modules/credits/credits.dm new file mode 100644 index 00000000000..5278c2849b6 --- /dev/null +++ b/code/modules/credits/credits.dm @@ -0,0 +1,147 @@ +var/global/datum/credits/end_credits = new + +/datum/credits + var/generated = FALSE + var/starting_delay = 8 SECONDS + var/control = "mapwindow.credits" + var/file = 'code/modules/credits/credits.html' + + var/director = "Pomf Chicken Productions" + var/list/producers = list() + var/mob/living/carbon/human/star + var/list/disclaimers = list() + var/list/datum/episode_name/episode_names = list() + var/episode_name = "" + + var/producers_string = "" + var/episode_string = "" + var/cast_string = "" + var/disclaimers_string = "" + +/datum/credits/proc/on_roundend() + generate_caststring() //roundend grief not included in the credits + generate_producerstring() //so that we show admins who have logged out before the credits roll + draft_disclaimers() + draft_episode_names() //only selects the possibilities, doesn't pick one yet + generated = TRUE + +/datum/credits/proc/rollem() + world << sound('sound/music/Frolic_Luciano_Michelini.ogg') + + finalize_disclaimerstring() //finalize it after the admins have had time to edit them + if(episode_name == "") //admin might've already set one + pick_name() + finalize_episodestring() + + var/scrollytext = episode_string + cast_string + disclaimers_string + + var/list/js_args = list(scrollytext, producers_string, 25, 2000) + + for(var/client/C in clients) + C.show_credits(js_args) + +/client/proc/show_credits(var/list/js_args) + set waitfor = FALSE + + verbs += /client/proc/clear_credits + + src << output(end_credits.file, end_credits.control) + sleep(end_credits.starting_delay) + src << output(list2params(js_args), "[end_credits.control]:makeCredits") + winset(src, end_credits.control, "is-visible=true") + +/client/proc/clear_credits() + set name = "Skip Credits" + set category = "OOC" + verbs -= /client/proc/clear_credits + winset(src, end_credits.control, "is-visible=false") + + + + +/datum/credits/proc/pick_name() + var/list/drafted_names = list() + for(var/datum/episode_name/N in episode_names) + drafted_names["[N.thename]"] = N.weight + episode_name = pickweight(drafted_names) + +/datum/credits/proc/finalize_episodestring(var/thename) + episode_string = "

SEASON [rand(1,22)] EPISODE [rand(1,17)]
[uppertext(episode_name)]


" + +/datum/credits/proc/finalize_disclaimerstring() + disclaimers_string = "
" + for(var/disclaimer in disclaimers) + disclaimers_string += "[disclaimer]
" + disclaimers_string += "
" + +/datum/credits/proc/generate_producerstring() + var/list/staff = list("

PRODUCTION STAFF


") + var/list/staffjobs = list("Coffee Fetcher", "Cameraman", "Angry Yeller", "Chair Operator", "Choreographer", "Historical Consultant", "Costume Designer", "Chief Editor", "Executive Assistant", "Key Grip") + if(!admins.len) + staff += "

PRODUCER - Alan Smithee


" + for(var/client/C in admins) + if(!C.holder) + continue + if(C.holder.rights & (R_DEBUG|R_ADMIN)) + var/observername = "" + if(C.mob && istype(C.mob,/mob/dead/observer)) + var/mob/dead/observer/O = C.mob + if(O.started_as_observer) + observername = "[O.real_name] a.k.a. " + staff += "

[uppertext(pick(staffjobs))] - [observername]'[C.key]'


" + + producers = list("

Directed by
[uppertext(director)]

","[jointext(staff,"")]") + for(var/head in data_core.get_manifest_json()["heads"]) + producers += "

[head["rank"]]
[uppertext(head["name"])]


" + if(star) + producers += "

Starring
[thebigstar(star)]


" + + producers_string = "" + for(var/producer in end_credits.producers) + producers_string += "[producer]%n" //%n being an arbitrary "new producer" char we use to split this string back in the javascript + +/datum/credits/proc/generate_caststring() + cast_string = "

CAST:


(in order of appearance)


" + cast_string += "" + for(var/mob/living/carbon/human/H in living_mob_list|dead_mob_list) + if(H.iscorpse || (H.timeofdeath && H.timeofdeath < 5 MINUTES)) //don't mention these losers (prespawned corpses mostly) + continue + if(!star || H.talkcount > star.talkcount) + star = H + + cast_string += "[gender_credits(H)]" + + cast_string += "

" + cast_string += "
" + var/list/corpses = list() + for(var/mob/living/carbon/human/H in dead_mob_list) + if(H.iscorpse || (H.timeofdeath && H.timeofdeath < 5 MINUTES)) //no prespawned corpses + continue + else if(H.real_name) + corpses += H.real_name + if(corpses.len) + var/true_story_bro = "
[pick("BASED ON","INSPIRED BY","A RE-ENACTMENT OF")] [pick("A TRUE STORY","REAL EVENTS","THE EVENTS ABOARD [uppertext(station_name())]")]" + cast_string += "

[true_story_bro]


In memory of those that did not make it.
[english_list(corpses)].
" + cast_string += "

" + +/proc/gender_credits(var/mob/living/carbon/human/H) + if(H.mind && H.mind.key) + return "[uppertext(H.mind.key)] as [H.real_name], [H.get_assignment()]" + else + var/t_him = "Them" + if(H.gender == MALE) + t_him = "Him" + else if(H.gender == FEMALE) + t_him = "Her" + return "[uppertext(H.real_name)] as [t_him]self" + +/proc/thebigstar(var/mob/living/carbon/human/H) + if(H.mind && H.mind.key) + return "[uppertext(H.mind.key)] as [H.real_name]" + else + var/t_him = "Them" + if(H.gender == MALE) + t_him = "Him" + else if(H.gender == FEMALE) + t_him = "Her" + return "[uppertext(H.real_name)] as [t_him]self" diff --git a/code/modules/credits/credits.html b/code/modules/credits/credits.html new file mode 100644 index 00000000000..69d6f76fb74 --- /dev/null +++ b/code/modules/credits/credits.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + +
+ IF YOU CAN SEE THIS, TELL A CODER WHAT HAPPENED! +
+ IF YOU CAN SEE THIS, REALLY TELL A CODER WHAT HAPPENED! +
+ + + + diff --git a/code/modules/credits/episode_name.dm b/code/modules/credits/episode_name.dm new file mode 100644 index 00000000000..a7fae25cf9b --- /dev/null +++ b/code/modules/credits/episode_name.dm @@ -0,0 +1,45 @@ +/datum/episode_name + var/thename = "" + var/reason = "Default episode name." //Explanation on why this episode name fits this round. For the admin panel. + var/weight = 100 //50 will have 50% the chance of being picked. 200 will have 200% the chance of being picked. etc + +/datum/episode_name/New(var/thename, var/reason, var/weight) + if(!thename) + return + src.thename = thename + if(reason) + src.reason = reason + if(weight) + src.weight = weight + +/datum/episode_name/proc/make_div(var/admindatum) //This is just for the admin panel. + . = "[weight]% (Set) - " + . += "[thename] - (Edit) " + . += "(Remove) " + . += "(?)" + +/datum/credits/proc/draft_episode_names() + episode_names += new /datum/episode_name("THE [pick("DOWNFALL OF", "RISE OF", "TROUBLE WITH", "FINAL STAND OF", "DARK SIDE OF")] [pick("SPACEMEN", "HUMANITY", "DIGNITY", "SANITY", "THE CHIMPANZEES", "THE VENDOMAT PRICES","[uppertext(station_name())]")]") + episode_names += new /datum/episode_name("THE CREW GETS [pick("RACIST", "PICKLED", "AN INCURABLE DISEASE", "PIZZA", "A VALUABLE HISTORY LESSON", "A BREAK", "HIGH", "TO LIVE", "TO RELIVE THEIR CHILDHOOD", "EMBROILED IN CIVIL WAR", "SERIOUS ABOUT [pick("DRUG ABUSE", "CRIME", "PRODUCTIVITY", "ANCIENT AMERICAN CARTOONS", "SPACEBALL")]")]") + episode_names += new /datum/episode_name("THE CREW LEARNS ABOUT [pick("LOVE", "DRUGS", "THE DANGERS OF MONEY LAUNDERING", "SPACE 'NAM", "INVESTMENT FRAUD", "KELOTANE ABUSE", "RADIATION PROTECTION", "SACRED GEOMETRY", "STRING THEORY", "ABSTRACT MATHEMATICS", "[pick("CATBEAST", "DIONAN", "PLASMAMAN", "VOX", "GREY")] MATING RITUALS", "ANCIENT CHINESE MEDICINE","LAWSETS")]") + episode_names += new /datum/episode_name("[pick("MUCH ADO ABOUT NOTHING", "WHAT HAPPENS WHEN YOU MIX MOMMIS AND COMMERCIAL-GRADE PACKING FOAM", "ATTACK! ATTACK! ATTACK!", "SEX BOMB", "THE BALLAD OF [uppertext(station_name())]")]") + episode_names += new /datum/episode_name("[pick("SPACE", "SEXY", "DRAGON", "WARLOCK", "LAUNDRY", "GUN", "ADVERTISING", "DOG", "CARBON MONOXIDE", "NINJA", "WIZARD", "SOCRATIC", "JUVENILE DELIQUENCY", "POLITICALLY MOTIVATED", "RADTACULAR SICKNASTY")] [pick("QUEST", "FORCE", "ADVENTURE")]") + episode_names += new /datum/episode_name("[pick("THE DAY [uppertext(station_name())] STOOD STILL", "HUNT FOR THE GREEN WEENIE", "ALIEN VS VENDOMAT", "SPACE TRACK")]") + if(SNOW_THEME) + episode_names += new /datum/episode_name("A VERY [pick("NANOTRASEN", "EXPEDITIONARY", "SECURE", "PLASMA", "MARTIAN")] CHRISTMAS", "'Tis the season.", 500) + if(score["gunsspawned"] > 0) + episode_names += new /datum/episode_name("GUNS, GUNS EVERYWHERE", "[score["gunsspawned"]] guns were spawned this round.", max(100, score["gunsspawned"]*10)) + if(score["richestcash"] > 30000) + episode_names += new /datum/episode_name("THE IRRESISTIBLE RISE OF [uppertext(score["richestname"])]", "Scrooge Mc[score["richestkey"]] racked up [score["richestcash"]] credits this round.", max(100, score["richestcash"]/300)) + if(score["deadaipenalty"] > 2) + episode_names += new /datum/episode_name("THE ONE WHERE [score["deadaipenalty"]] AIS DIE", "That's a lot of dead AIs.", max(100, score["deadaipenalty"]*50)) + if(score["deadcrew"] == 0) + episode_names += new /datum/episode_name("[pick("EMPLOYEE TRANSFER", "PEACE AND QUIET IN [uppertext(station_name())]", "THE CREW TRIES TO KILL A FLY FOR [round(score["time"]/60)] MINUTES")]", "No-one died this round.", 200) + if(score["escapees"] == 0 && emergency_shuttle.location == CENTCOMM_Z) + episode_names += new /datum/episode_name("[pick("DEAD SPACE", "THE CREW GOES MISSING", "A ONE-WAY TICKET TO FLAVORTOWN")]", "There were no escapees on the shuttle.", 200) + if(score["slips"] > 100) + episode_names += new /datum/episode_name("THE CREW GOES BANANAS", "[score["slips"]] people slipped this round.", min(200, score["slips"]/2)) + for(var/mob/living/simple_animal/corgi/C in living_mob_list) + if(C.spell_list.len > 0) + episode_names += new /datum/episode_name("[pick("A VERY MAGICAL DAY", "IAN SAYS", "IAN'S DAY OUT", "CORGI MAGIC")]", "You know what you did.", 300) + break diff --git a/code/modules/medical/cloning.dm b/code/modules/medical/cloning.dm index 77160535a8d..d2e57e9ebb0 100644 --- a/code/modules/medical/cloning.dm +++ b/code/modules/medical/cloning.dm @@ -227,6 +227,7 @@ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species, delay_ready_dna = TRUE) occupant = H H.times_cloned = R.times_cloned +1 + H.talkcount = R.talkcount if(!connected.emagged) icon_state = "pod_1" diff --git a/code/modules/medical/computer/cloning.dm b/code/modules/medical/computer/cloning.dm index 0be9bfdadc4..6623884839c 100644 --- a/code/modules/medical/computer/cloning.dm +++ b/code/modules/medical/computer/cloning.dm @@ -495,6 +495,7 @@ R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE R.languages = subject.languages.Copy() R.times_cloned = subject.times_cloned + R.talkcount = subject.talkcount //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index c384d4e6d17..205ae4b574d 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -91,4 +91,5 @@ var/show_client_status_on_examine = TRUE //If false, don't display catatonic/braindead messages to non-admins var/become_zombie_after_death = FALSE - var/times_cloned = 0 //How many times this person has been cloned \ No newline at end of file + var/times_cloned = 0 //How many times this person has been cloned + var/talkcount = 0 // How many times a person has talked - used for determining who's been the "star" for the purposes of round end credits diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 1bb0f46ad28..17799573ae8 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -247,6 +247,10 @@ var/list/department_radio_keys = list( for (var/atom/movable/listener in listening_nonmobs) listener.Hear(speech, rendered) +/mob/living/carbon/human/send_speech(var/datum/speech/speech, var/message_range=7, var/bubble_type) + talkcount++ + . = ..() + /mob/living/proc/say_test(var/text) var/ending = copytext(text, length(text)) if (ending == "?") diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index bdabcda6e1e..d5786bc821e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -45,6 +45,7 @@ icon_living = "cat" icon_dead = "cat_dead" gender = FEMALE + is_pet = TRUE /mob/living/simple_animal/cat/Proc name = "Proc" @@ -152,4 +153,4 @@ var/list/wizard_snakes = list() /mob/living/simple_animal/cat/snek/wizard/Destroy() wizard_snakes[src] = null wizard_snakes -= src - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 7a64b1685c1..924402b1da2 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -472,6 +472,7 @@ response_disarm = "bops" response_harm = "kicks" spin_emotes = list("dances around","chases his tail") + is_pet = TRUE /mob/living/simple_animal/corgi/Ian/santa name = "Santa's Corgi Helper" @@ -631,6 +632,7 @@ icon_living = "doby" icon_dead = "doby_dead" spin_emotes = list("prances around","chases her nub of a tail") + is_pet = TRUE species_type = /mob/living/simple_animal/corgi/sasha meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/animal diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index da6f850d729..ccf2489d34b 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -859,6 +859,7 @@ name = "Poly" desc = "Poly the Parrot. An expert on quantum cracker theory." speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE") + is_pet = TRUE /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/device/radio/headset/headset_eng(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c2b9def5115..d41aa93ac03 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -72,7 +72,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t var/melee_damage_type = BRUTE var/attacktext = "attacks" var/attack_sound = null - var/friendly = "nuzzles" //If the mob does no damage with it's attack + var/friendly = "nuzzles" //If the mob does no damage with its attack // var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls var/environment_smash_flags = 0 @@ -100,6 +100,8 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t var/life_tick = 0 var/list/colourmatrix = list() + var/is_pet = FALSE //We're somebody's precious, precious pet. + /mob/living/simple_animal/apply_beam_damage(var/obj/effect/beam/B) var/lastcheck=last_beamchecks["\ref[B]"] diff --git a/code/world.dm b/code/world.dm index 1aa9cc70e41..892ee11d7e4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -269,26 +269,11 @@ var/savefile/panicfile Master.Shutdown() paperwork_stop() - spawn() - world << sound(pick( - 'sound/AI/newroundsexy.ogg', - 'sound/misc/RoundEndSounds/apcdestroyed.ogg', - 'sound/misc/RoundEndSounds/bangindonk.ogg', - 'sound/misc/RoundEndSounds/slugmissioncomplete.ogg', - 'sound/misc/RoundEndSounds/bayojingle.ogg', - 'sound/misc/RoundEndSounds/gameoveryeah.ogg', - 'sound/misc/RoundEndSounds/rayman.ogg', - 'sound/misc/RoundEndSounds/marioworld.ogg', - 'sound/misc/RoundEndSounds/soniclevelcomplete.ogg', - 'sound/misc/RoundEndSounds/calamitytrigger.ogg', - 'sound/misc/RoundEndSounds/duckgame.ogg', - 'sound/misc/RoundEndSounds/FTLvictory.ogg', - 'sound/misc/RoundEndSounds/tfvictory.ogg', - 'sound/misc/RoundEndSounds/megamanX.ogg', - 'sound/misc/RoundEndSounds/castlevania.ogg', - )) // random end sounds!! - LastyBatsy + if(!end_credits.generated) + end_credits.on_roundend() + end_credits.rollem() - sleep(5)//should fix the issue of players not hearing the restart sound. + sleep(end_credits.starting_delay + 10) for(var/client/C in clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite diff --git a/config-example/config.txt b/config-example/config.txt index 8d8326bae33..9d6b859ae77 100644 --- a/config-example/config.txt +++ b/config-example/config.txt @@ -296,6 +296,10 @@ RENDERS_URL http://ss13.pomf.se/img/map-renders ## Uncomment to disable generation of minimaps (makes the server start faster!) SKIP_MINIMAP_GENERATION +## SKIP_HOLOMINIMAP_GENERATION +## Uncomment to disable generation of holominimaps (makes the server start faster!) +SKIP_HOLOMINIMAP_GENERATION + ## SKIP_VAULT_GENERATION ## Uncomment to disable generation of vaults (makes the server start faster!) SKIP_VAULT_GENERATION diff --git a/icons/credits/1zas.png b/icons/credits/1zas.png new file mode 100644 index 00000000000..f7d7cb1eeb2 Binary files /dev/null and b/icons/credits/1zas.png differ diff --git a/icons/credits/2cluck.png b/icons/credits/2cluck.png new file mode 100644 index 00000000000..06e2655692a Binary files /dev/null and b/icons/credits/2cluck.png differ diff --git a/icons/credits/3MPAOSA.png b/icons/credits/3MPAOSA.png new file mode 100644 index 00000000000..3062d73b335 Binary files /dev/null and b/icons/credits/3MPAOSA.png differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 1392ba80980..7f1b34f9123 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -816,6 +816,17 @@ window "mapwindow" text-color = none is-default = true saved-params = "icon-size" + elem "credits" + type = BROWSER + pos = 0,0 + size = 640x480 + anchor1 = 0,0 + anchor2 = 100,100 + text-color = #ffffff + background-color = #000000 + is-visible = false + saved-params = "" + auto-format = false window "outputwindow" elem "outputwindow" @@ -1063,4 +1074,3 @@ window "window1" background-color = #fffdd0 border = sunken saved-params = "max-lines" - diff --git a/sound/music/Frolic_Luciano_Michelini.ogg b/sound/music/Frolic_Luciano_Michelini.ogg new file mode 100644 index 00000000000..b215724e441 Binary files /dev/null and b/sound/music/Frolic_Luciano_Michelini.ogg differ diff --git a/sound/music/Frolic_Luciano_Michelini_Short.ogg b/sound/music/Frolic_Luciano_Michelini_Short.ogg new file mode 100644 index 00000000000..b19f239820f Binary files /dev/null and b/sound/music/Frolic_Luciano_Michelini_Short.ogg differ diff --git a/vgstation13.dme b/vgstation13.dme index 70076c3d6d3..07854d5bf96 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -1328,6 +1328,9 @@ #include "code\modules\components\ai\target_holders\target_holder.dm" #include "code\modules\context_click\context_click.dm" #include "code\modules\context_click\remote.dm" +#include "code\modules\credits\credit_disclaimers.dm" +#include "code\modules\credits\credits.dm" +#include "code\modules\credits\episode_name.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\customitems\definitions\base.dm" #include "code\modules\customitems\definitions\N3X15.dm"