So uhhhh... I guess there's stuff now.
|
@ -0,0 +1,19 @@
|
|||
Copyright (c) 2021 Marisa Kirisame, UnSX Team
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1 @@
|
|||
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
16
README.md
|
@ -237,7 +237,7 @@ A very potent timed explosive. Make sure to take cover, because it hits hard. Us
|
|||
|
||||
*"Bottoms up!"*
|
||||
|
||||
This will bring you back to full health and give you a fairly decent strength boost. Do note however that **Ibuki**'s body metabolizes the drunkedness away quickly. Part of **Ellen**'s seemingly unending stash.
|
||||
This will bring you back to full health and give you a fairly decent strength boost *(Enough to tear enemies apart with your bare hands)*. Do note however that **Ibuki**'s body metabolizes the drunkedness away quickly. Part of **Ellen**'s seemingly unending stash.
|
||||
|
||||
### Omnisight *[Computer Map]*
|
||||
|
||||
|
@ -263,6 +263,18 @@ Cheap and easy night vision goggles. Can be toggled if you wanna save that batte
|
|||
|
||||
The usual solution for getting into dangerous terrain. Just pop it and go for a dive.
|
||||
|
||||
### Aerial Amulet *[Wings of Wrath]*
|
||||
|
||||
*"It's surprising that this thing can even lift me off the ground."*
|
||||
|
||||
A convenient little magic artifact that allows you to float in mid-air. Far more comfortable than the **Gravity Suppressor**, but unlike that one, this has a weight limit *(poor **Demo-chan**, their shiny metal butt is just too damn heavy)*. Its effects can be conveniently toggled at will, allowing you to save up energy when needed.
|
||||
|
||||
### Safety Tether *[Chaos Device]*
|
||||
|
||||
*"I'm outta here, bitches."*
|
||||
|
||||
Allows you to make a quick escape back to the start of the map when activated. Also releases some damaging shockwaves on both endpoints in the process. Useful when you're trapped in some inescapable room, or get surrounded by an overwhelming amount of enemies.
|
||||
|
||||
---
|
||||
|
||||
## Bonus Features
|
||||
|
@ -381,7 +393,7 @@ You'll find these either all alone or in small handfuls. The Stormbringer takes
|
|||
|
||||
## Compatibility
|
||||
|
||||
**Doom** is pretty much the baseline here. **Heretic** support could *"maybe"* be added post-release but it wouldn't really be a priority. I don't think it'd fit much with this both gameplay and story-wise. Same with **Hexen**. It's very likely that it'll remain solely **Doom** compatible and nothing more. As there's not much id-specific here like there was with **SWWM GZ**, it could also work with **Freedoom**, I suppose.
|
||||
**Doom** is pretty much the baseline here. **Heretic** support will be added later on but it won't be a high priority. In regards to **Hexen** I don't think it'd fit much both gameplay and story-wise. It's very likely that it'll remain solely **Doom** and **Heretic** compatible and nothing more. As there's not much id-specific here like there was with **SWWM GZ**, it could also work with **Freedoom**, I suppose.
|
||||
|
||||
Note: Playing through vanilla maps with this would be considered a storyline discrepancy, but I'm not gonna stop you.
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Title music:
|
||||
Teque - Rock Bug Opera
|
|
@ -0,0 +1,19 @@
|
|||
// shared cvars
|
||||
nosave float oni_flashstrength = 1.0;
|
||||
nosave bool oni_shaders = true;
|
||||
server bool oni_blood = true;
|
||||
server int oni_maxblood = 400;
|
||||
server int oni_maxgibs = 100;
|
||||
server int oni_maxcasings = 200;
|
||||
server int oni_maxdebris = 500;
|
||||
nosave bool oni_fuzz = true;
|
||||
server int oni_enemydrops = 0;
|
||||
server bool oni_shadows = true;
|
||||
nosave int oni_shadowdist = 2000;
|
||||
server int oni_pistolstart = 0;
|
||||
server int oni_drlaskill = 3;
|
||||
server bool oni_singlefirst = false;
|
||||
nosave bool oni_weapontooltips = true;
|
||||
nosave string oni_tooltipshown = "";
|
||||
nosave noarchive bool oni_tooltipnote = false;
|
||||
nosave int oni_playtime = 0;
|
|
@ -0,0 +1 @@
|
|||
Commercial Doom
|
|
@ -0,0 +1,3 @@
|
|||
STARTUPCOLORS = "A0 00 00", "80 00 00"
|
||||
STARTUPTITLE = "RED ONI"
|
||||
STARTUPTYPE = "Doom"
|
|
@ -0,0 +1,75 @@
|
|||
HardwareShader Texture "graphics/tempbg.png"
|
||||
{
|
||||
Shader "shaders/glsl/Fuzz.fp"
|
||||
Texture "noisetex" "textures/graynoise.png"
|
||||
Define "ONICOLORS"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_ibuki.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_ibuki_dark.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_ibuki_eye.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_ibuki_smoke.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear_wave.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_0.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_1.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_2.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_3.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_4.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_5.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_6.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/title_smoke_7.png"
|
||||
{
|
||||
Shader "shaders/glsl/Bilinear.fp"
|
||||
}
|
||||
HardwareShader Texture "graphics/OniLogoL.png"
|
||||
{
|
||||
Shader "shaders/glsl/OniLogoAnimated.fp"
|
||||
Define "TEX_SZ" = "vec2(1024.,1024.)"
|
||||
Define "TEX_AR" = "1."
|
||||
Texture "LogoTex" "graphics/OniLogoL_Layers.png"
|
||||
}
|
||||
HardwareShader Texture "graphics/OniLogoR.png"
|
||||
{
|
||||
Shader "shaders/glsl/OniLogoAnimated.fp"
|
||||
Define "TEX_SZ" = "vec2(1024.,1024.)"
|
||||
Define "TEX_AR" = "1."
|
||||
Texture "LogoTex" "graphics/OniLogoR_Layers.png"
|
||||
}
|
||||
HardwareShader Texture "graphics/M_REDONI.png"
|
||||
{
|
||||
Shader "shaders/glsl/OniLogoAnimated.fp"
|
||||
Define "TEX_SZ" = "vec2(256.,128.)"
|
||||
Define "TEX_AR" = "2."
|
||||
Texture "LogoTex" "graphics/M_REDONI_Layers.png"
|
||||
}
|
After Width: | Height: | Size: 356 B |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 169 KiB |
After Width: | Height: | Size: 534 KiB |
After Width: | Height: | Size: 580 KiB |
After Width: | Height: | Size: 2.6 MiB |
After Width: | Height: | Size: 561 KiB |
After Width: | Height: | Size: 378 KiB |
After Width: | Height: | Size: 2.9 MiB |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 196 B |
After Width: | Height: | Size: 731 B |
After Width: | Height: | Size: 369 B |
After Width: | Height: | Size: 1.9 MiB |
After Width: | Height: | Size: 918 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,24 @@
|
|||
[default]
|
||||
// tags, pickups
|
||||
// quit messages
|
||||
QUITMSG = "Leaving already?\nI'll be waiting, sweetie...";
|
||||
QUITMSG1 = "Oh, don't worry, I'm sure\nwe can have more fun later.";
|
||||
QUITMSG2 = "Hope you come back soon.\nI like playing with you.";
|
||||
QUITMSG3 = "You'll come back for sure.\nYou already had your first taste.";
|
||||
QUITMSG4 = "If you promise to come back,\nI'll give you a nice treat.";
|
||||
QUITMSG5 = "Do you like killing demons?\nLet's kill more demons next time.";
|
||||
QUITMSG6 = "Farewell, my cute little player...";
|
||||
QUITMSG7 = "Have you met Demo-chan?\nTheir adventures are fun too.";
|
||||
QUITMSG8 = "Ah, my tits feel heavy...\nWill you hold them for me?";
|
||||
QUITMSG9 = "Don't forget to stay hydrated.\nYou'll definitely need it.";
|
||||
QUITMSG10 = "I suppose you need a break.\nThat's understandable, of course.";
|
||||
QUITMSG11 = "Aw, leaving already?\nThat's a shame...";
|
||||
// obituaries
|
||||
// misc
|
||||
ONI_TITLEPRESENTSA = "UnSX Team";
|
||||
ONI_TITLEPRESENTSB = "presents";
|
||||
ONI_TITLEMODBYA = "a mod by";
|
||||
ONI_TITLEMODBYB = "Marisa Kirisame";
|
||||
ONI_TITLEINTROA = "\"and he thus said to his people: do no evil, lest you wish";
|
||||
ONI_TITLEINTROB = "to bring upon yourself the unyielding fury of the \crRED ONI\c-\"";
|
||||
// weapon tooltips
|
|
@ -0,0 +1,18 @@
|
|||
[default]
|
||||
// keybinds
|
||||
// skills
|
||||
ONI_SKCHILL="\cv5.56x45mm\c-";
|
||||
ONI_SKEASY="\cd7.62x51mm\c-";
|
||||
ONI_SKNORMAL="\cf12.7x99mm\c-";
|
||||
ONI_SKHARD="\ci14.5x114mm\c-";
|
||||
ONI_SKHARDCORE="\cr20x102mm\c-";
|
||||
ONI_SKHARDCORECONFIRM="\crAre you sure you want to do that?\nYou might get your ass kicked if you pick this.\c-\n\n(Press Y for a challenge)";
|
||||
ONI_SKLUNATIC="\cm30x173mm\c-";
|
||||
ONI_SKLUNATICCONFIRM="\cmYou've clearly got a death wish.\nChoose this skill if you dare.\c-\n\n(Press Y to die instantly)";
|
||||
// mod menu
|
||||
ONI_MTITLE = "RED ONI Options";
|
||||
ONI_MCREDS = "RED ONI Credits";
|
||||
// credits
|
||||
ONI_CSTITLE = "UnSX Side Story: Ibuki";
|
||||
ONI_CSTITLE2 = "Big Tiddy Supersoldier Goth GF";
|
||||
// Help menu
|
|
@ -0,0 +1,3 @@
|
|||
[default]
|
||||
ONI_MODVER="\crRED ONI\c- \cw0.1a \cu(Wed 3 Nov 02:11:53 CET 2021)\c-";
|
||||
ONI_SHORTVER="\cw0.1a \cu(2021-11-03 02:11:53)\c-";
|
|
@ -0,0 +1,144 @@
|
|||
OptionValue "SWWMEnemyDropType"
|
||||
{
|
||||
-1, "$SWWM_DROPS_NONE"
|
||||
0, "$SWWM_DROPS_AMMO"
|
||||
1, "$SWWM_DROPS_WEAPONS"
|
||||
}
|
||||
OptionValue "SWWMDRLASkill"
|
||||
{
|
||||
0, "$SWWM_DRLASKILL_BABY"
|
||||
1, "$SWWM_DRLASKILL_EASY"
|
||||
2, "$SWWM_DRLASKILL_NORMAL"
|
||||
3, "$SWWM_DRLASKILL_HARD"
|
||||
4, "$SWWM_DRLASKILL_NIGHTMARE"
|
||||
5, "$SWWM_DRLASKILL_TECHNOPHOBIA"
|
||||
6, "$SWWM_DRLASKILL_ARMAGEDDON"
|
||||
7, "$SWWM_DRLASKILL_ADAPTIVE"
|
||||
}
|
||||
OptionValue "SWWMPistolStart"
|
||||
{
|
||||
0, "$TXT_NO"
|
||||
1, "$SWWM_PISTOLSTART_MAP"
|
||||
2, "$SWWM_PISTOLSTART_CLUSTER"
|
||||
}
|
||||
OptionMenu "OniOptionMenu"
|
||||
{
|
||||
Class "SWWMOptionMenu"
|
||||
Title "$ONI_MTITLE"
|
||||
|
||||
SafeCommand "$SWWM_CRESET", "event swwmresetcvars"
|
||||
StaticText " "
|
||||
|
||||
StaticText "$SWWM_PTITLE", "DarkRed"
|
||||
SWWMPlayTime "$SWWM_PLAYTIME", "oni_playtime"
|
||||
StaticText " "
|
||||
StaticText "$SWWM_OTITLE", "DarkRed"
|
||||
Option "$SWWM_SHADERS", "oni_shaders", "YesNo"
|
||||
Slider "$SWWM_FLASH", "oni_flashstrength", 0.0, 1.0, 0.1, 1
|
||||
Slider "$SWWM_BUMP", "oni_bumpstrength", 0.0, 1.0, 0.1, 1
|
||||
Option "$SWWM_FUZZ", "oni_fuzz", "YesNo"
|
||||
StaticText " "
|
||||
StaticText "$SWWM_ETITLE", "DarkRed"
|
||||
Option "$SWWM_SHADOWS", "oni_shadows", "YesNo"
|
||||
ScaleSlider "$SWWM_SHADOWDIST", "oni_shadowdist", -1, 4000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
|
||||
Option "$SWWM_BLOOD", "oni_blood", "YesNo"
|
||||
ScaleSlider "$SWWM_MAXBLOOD", "oni_maxblood", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
|
||||
ScaleSlider "$SWWM_MAXGIBS", "oni_maxgibs", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
|
||||
ScaleSlider "$SWWM_MAXCASINGS", "oni_maxcasings", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
|
||||
ScaleSlider "$SWWM_MAXDEBRIS", "oni_maxdebris", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
|
||||
StaticText " "
|
||||
StaticText "$SWWM_BTITLE", "DarkRed"
|
||||
Option "$SWWM_PISTOLSTART", "oni_pistolstart", "SWWMPistolStart"
|
||||
Option "$SWWM_ENEMYDROPS", "oni_enemydrops", "SWWMEnemyDropType"
|
||||
StaticText " "
|
||||
StaticText "$SWWM_ITITLE", "DarkRed"
|
||||
Option "$SWWM_SINGLEFIRST", "oni_singlefirst", "YesNo"
|
||||
Option "$SWWM_WEAPONTOOLTIPS", "oni_weapontooltips", "YesNo"
|
||||
SafeCommand "$SWWM_RESETTOOLTIPS", "event swwmresettooltips"
|
||||
StaticText " "
|
||||
StaticText "$SWWM_MCTITLE", "DarkRed"
|
||||
Option "$SWWM_DRLASKILL", "oni_drlaskill", "SWWMDRLASkill"
|
||||
StaticText " "
|
||||
StaticText " "
|
||||
|
||||
}
|
||||
AddOptionMenu "OptionsMenu"
|
||||
{
|
||||
Submenu "$ONI_MTITLE", "OniOptionMenu"
|
||||
Submenu "$ONI_MCREDS", "OniCreditsMenu"
|
||||
}
|
||||
AddOptionMenu "OptionsMenuSimple"
|
||||
{
|
||||
Submenu "$ONI_MTITLE", "OniOptionMenu"
|
||||
Submenu "$ONI_MCREDS", "OniCreditsMenu"
|
||||
}
|
||||
ListMenu "MainMenu"
|
||||
{
|
||||
Class "SWWMMainMenu"
|
||||
Size Clean
|
||||
Font "TewiShadedOutline", "DarkGray", "Red"
|
||||
Selector "graphics/IbukiIcon.png", -24, 0
|
||||
LineSpacing 36
|
||||
SWWMLogo
|
||||
Position 0, 56
|
||||
SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu"
|
||||
SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu"
|
||||
SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu"
|
||||
SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu"
|
||||
SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu"
|
||||
}
|
||||
ListMenu "MainMenuTextOnly"
|
||||
{
|
||||
Class "SWWMMainMenu"
|
||||
Size Clean
|
||||
Font "TewiShadedOutline", "DarkGray", "Red"
|
||||
Selector "graphics/IbukiIcon.png", -24, 0
|
||||
LineSpacing 36
|
||||
SWWMLogo
|
||||
Position 0, 56
|
||||
SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu"
|
||||
SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu"
|
||||
SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu"
|
||||
SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu"
|
||||
SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu"
|
||||
}
|
||||
ListMenu "GameFilesMenu"
|
||||
{
|
||||
Class "SWWMCleanMenu"
|
||||
Size Clean
|
||||
Font "TewiShadedOutline", "DarkGray", "Red"
|
||||
Selector "graphics/IbukiIcon.png", -24, 0
|
||||
LineSpacing 36
|
||||
Position 0, 88
|
||||
SWWMTextItemM "$MNU_LOADGAME", "l", "LoadGameMenu"
|
||||
SWWMTextItemM "$MNU_SAVEGAME", "s", "SaveGameMenu"
|
||||
}
|
||||
ListMenu "EpisodeMenu"
|
||||
{
|
||||
Class "SWWMBigMenuHack"
|
||||
Size Clean
|
||||
IfGame(Doom, Heretic, Hexen, Strife)
|
||||
{
|
||||
NetgameMessage "$NEWGAME"
|
||||
}
|
||||
IfGame(Chex)
|
||||
{
|
||||
NetgameMessage "$CNEWGAME"
|
||||
}
|
||||
Font "TewiShadedOutline", "DarkGray", "Red"
|
||||
Selector "graphics/IbukiIcon.png", -24, 0
|
||||
LineSpacing 0
|
||||
SWWMStaticTextM 0, 0, "$MNU_EPISODE", "DarkRed"
|
||||
Position 0, 0
|
||||
}
|
||||
|
||||
ListMenu "SkillMenu"
|
||||
{
|
||||
Class "SWWMBigMenuHack"
|
||||
Size Clean
|
||||
Font "TewiShadedOutline", "DarkGray", "Red"
|
||||
Selector "graphics/IbukiIcon.png", -24, 0
|
||||
LineSpacing 0
|
||||
SWWMStaticTextM 0, 0, "$MNU_CHOOSESKILL", "DarkRed"
|
||||
Position 0, 0
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
// This should act as Bilinear filtering when texture filtering is disabled
|
||||
// the algo is pretty much public domain, so no credit given
|
||||
|
||||
vec4 BilinearSample( in vec2 size, in vec2 pxsize, in vec2 pos )
|
||||
{
|
||||
vec2 f = fract(pos*size);
|
||||
pos += (.5-f)*pxsize;
|
||||
vec4 p0q0 = texture(tex,pos);
|
||||
vec4 p1q0 = texture(tex,pos+vec2(pxsize.x,0));
|
||||
vec4 p0q1 = texture(tex,pos+vec2(0,pxsize.y));
|
||||
vec4 p1q1 = texture(tex,pos+vec2(pxsize.x,pxsize.y));
|
||||
vec4 pInterp_q0 = mix(p0q0,p1q0,f.x);
|
||||
vec4 pInterp_q1 = mix(p0q1,p1q1,f.x);
|
||||
return mix(pInterp_q0,pInterp_q1,f.y);
|
||||
}
|
||||
|
||||
void SetupMaterial( inout Material mat )
|
||||
{
|
||||
vec2 size = textureSize(tex,0);
|
||||
vec2 pxsize = vec2(1./size.x,1./size.y);
|
||||
vec2 pos = vTexCoord.st;
|
||||
pos.x += .15*sin(pos.y*6.+timer*1.4)*clamp(.9-pos.y,0.,1.);
|
||||
mat.Base = BilinearSample(size,pxsize,pos);
|
||||
mat.Normal = ApplyNormalMap(pos);
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
// ah shit here we go again
|
||||
|
||||
#define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b)))
|
||||
const float pi = 3.14159265358979323846;
|
||||
|
||||
vec2 warpcoord( in vec2 uv )
|
||||
{
|
||||
vec2 offset = vec2(0,0);
|
||||
offset.x = sin(pi*2.*(uv.x*2.*TEX_AR+timer*.125))*.02;
|
||||
offset.y += timer*.25;
|
||||
offset.x = cos(pi*2.*(uv.y*2.+timer*.125))*.02;
|
||||
return fract(uv+offset);
|
||||
}
|
||||
|
||||
vec2 warpcoord2( in vec2 uv )
|
||||
{
|
||||
vec2 offset = vec2(0,0);
|
||||
offset.y = sin(pi*2.*(uv.x*4.*TEX_AR+timer*.25))*.01;
|
||||
offset.x = cos(pi*2.*(uv.y*4.+timer*.25))*.01;
|
||||
return fract(uv+offset);
|
||||
}
|
||||
|
||||
// based on gimp color to alpha, but simplified
|
||||
vec4 blacktoalpha( in vec4 src )
|
||||
{
|
||||
vec4 dst = src;
|
||||
float dist = 0., alpha = 0.;
|
||||
float d, a;
|
||||
a = clamp(dst.r,0.,1.);
|
||||
if ( a > alpha )
|
||||
{
|
||||
alpha = a;
|
||||
dist = d;
|
||||
}
|
||||
a = clamp(dst.g,0.,1.);
|
||||
if ( a > alpha )
|
||||
{
|
||||
alpha = a;
|
||||
dist = d;
|
||||
}
|
||||
a = clamp(dst.b,0.,1.);
|
||||
if ( a > alpha )
|
||||
{
|
||||
alpha = a;
|
||||
dist = d;
|
||||
}
|
||||
if ( alpha > 0. )
|
||||
{
|
||||
float ainv = 1./alpha;
|
||||
dst.rgb *= ainv;
|
||||
}
|
||||
dst.a *= alpha;
|
||||
return dst;
|
||||
}
|
||||
|
||||
void SetupMaterial( inout Material mat )
|
||||
{
|
||||
// y'all ready for this multilayered madness?
|
||||
vec2 uv = vTexCoord.st;
|
||||
// copy
|
||||
vec4 base = texture(LogoTex,uv*vec2(.25,.5));
|
||||
// blend with mask
|
||||
vec4 tmp = texture(LogoTex,warpcoord(uv)*vec2(.25,.5)+vec2(.25,0.));
|
||||
vec4 tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.5,0.));
|
||||
base.rgb = mix(base.rgb,tmp.rgb,tmp2.r);
|
||||
// overlay with alpha
|
||||
tmp = texture(LogoTex,uv*vec2(.25,.5)+vec2(.75,0.));
|
||||
tmp2.r = overlay(base.r,tmp.r);
|
||||
tmp2.g = overlay(base.g,tmp.g);
|
||||
tmp2.b = overlay(base.b,tmp.b);
|
||||
base.rgb = mix(base.rgb,tmp2.rgb,tmp.a);
|
||||
// separate layer
|
||||
tmp = texture(LogoTex,uv*vec2(.25,.5)+vec2(0.,.5));
|
||||
// overlay
|
||||
tmp2 = texture(LogoTex,warpcoord2(uv)*vec2(.25,.5)+vec2(.25,.5));
|
||||
tmp.r = overlay(tmp.r,tmp2.r);
|
||||
tmp.g = overlay(tmp.g,tmp2.g);
|
||||
tmp.b = overlay(tmp.b,tmp2.b);
|
||||
// multiply
|
||||
tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.5,.5));
|
||||
tmp.rgb *= tmp2.rgb;
|
||||
// overlay again
|
||||
tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.75,.5));
|
||||
tmp.r = overlay(tmp.r,tmp2.r);
|
||||
tmp.g = overlay(tmp.g,tmp2.g);
|
||||
tmp.b = overlay(tmp.b,tmp2.b);
|
||||
// color to alpha and paste on top
|
||||
tmp = blacktoalpha(tmp);
|
||||
base.rgb = mix(base.rgb,tmp.rgb,tmp.a);
|
||||
base.a = min(base.a+tmp.a,1.);
|
||||
// clamp borders
|
||||
vec2 sz = TEX_SZ;
|
||||
vec2 px = uv*sz;
|
||||
if ( (px.x <= 1) || (px.x >= (sz.x-1)) || (px.y <= 1) || (px.y >= (sz.y-1)) )
|
||||
base = vec4(0.);
|
||||
// ding, logo's done
|
||||
mat.Base = base;
|
||||
mat.Normal = ApplyNormalMap(vTexCoord.st);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
$pitchshiftrange 0
|
||||
|
||||
aa12/fire1 sounds/aa12/aa12_fire1.ogg
|
||||
aa12/fire2 sounds/aa12/aa12_fire2.ogg
|
||||
aa12/fire3 sounds/aa12/aa12_fire3.ogg
|
||||
$random aa12/fire { aa12/fire1 aa12/fire2 aa12/fire3 }
|
||||
aa12/magin sounds/aa12/aa12_magin.ogg
|
||||
aa12/magout sounds/aa12/aa12_magout.ogg
|
||||
aa12/boltback sounds/aa12/aa12_boltback.ogg
|
||||
aa12/boltforward sounds/aa12/aa12_boltforward.ogg
|
||||
aa12/titlecock sounds/aa12/aa12_titlecock.ogg
|
||||
aa12/titlefire sounds/aa12/aa12_titlefire.ogg
|
||||
|
||||
title/thump sounds/titlethump.ogg
|
|
@ -0,0 +1,8 @@
|
|||
.git
|
||||
*.md
|
||||
docimg
|
||||
models/*.blend
|
||||
models/*.blend1
|
||||
models/*.xcf
|
||||
models/modelnotes.txt
|
||||
tools
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
WORKDIR=$(readlink -f $0 | sed 's/\(ibuki_m\)\(.*\)/\1/')
|
||||
LIBDIR=${WORKDIR}/../swwmgzlib_m
|
||||
DESTFILE=${WORKDIR}/../ibuki${1}_m.pk3
|
||||
mkdir -p /tmp/tempwork
|
||||
pushd /tmp/tempwork
|
||||
cp -ar $LIBDIR/* .
|
||||
cp -ar $WORKDIR/* .
|
||||
7z a -tzip -mx=9 -x@tools/excl.lst -up0q0r2x2y2z1w2 $DESTFILE '*'
|
||||
popd
|
||||
rm -rf /tmp/tempwork
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
WORKDIR=$(readlink -f $0 | sed 's/\(ibuki_m\)\(.*\)/\1/')
|
||||
pushd "$WORKDIR"
|
||||
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off -x@tools/excl.lst -up0q0r2x2y2z1w2 ../ibuki${1}_m.pk7 '../swwmgzlib_m/*' '*'
|
||||
popd
|
|
@ -0,0 +1,137 @@
|
|||
GameInfo
|
||||
{
|
||||
AddEventHandlers = "SWWMStaticHandler", "SWWMHandler"
|
||||
//PlayerClasses = "IbukiPlayer"
|
||||
//StatusBarClass = "OniStatusBar"
|
||||
BackpackType = "HammerspaceEmbiggener"
|
||||
QuitSound = "misc/teleport"
|
||||
QuitMessages = "$QUITMSG", "$QUITMSG1", "$QUITMSG2", "$QUITMSG3",
|
||||
"$QUITMSG4", "$QUITMSG5", "$QUITMSG6", "$QUITMSG7",
|
||||
"$QUITMSG8", "$QUITMSG9", "$QUITMSG10", "$QUITMSG11"
|
||||
ChatSound = "misc/chat"
|
||||
NoMergePickupMsg = true
|
||||
CursorPic = "graphics/onicurs.png"
|
||||
DimColor = "Black"
|
||||
DimAmount = 0.5
|
||||
BlurAmount = 0
|
||||
Endoom = "ENDIBUKI"
|
||||
PickupColor = "White"
|
||||
MenuFontColor_Title = "DarkRed"
|
||||
MenuFontColor_Label = "DarkGray"
|
||||
MenuFontColor_Value = "DarkRed"
|
||||
MenuFontColor_Action = "DarkGray"
|
||||
MenuFontColor_Header = "DarkRed"
|
||||
MenuFontColor_Highlight = "Red"
|
||||
MenuFontColor_Selection = "Red"
|
||||
MenuSliderColor = "DarkRed"
|
||||
MenuSliderBackColor = "DarkGray"
|
||||
MenuBackButton = "graphics/oniback.png"
|
||||
MessageBoxClass = "SWWMMessageBox"
|
||||
//HelpMenuClass = "OniHelpMenu"
|
||||
MenuDelegateClass = "SWWMMenuDelegate"
|
||||
PauseSign = "graphics/onipause.png"
|
||||
//BorderFlat = "graphics/bord_flat.png"
|
||||
//Border = 2, 0, "graphics/bord_tr.png", "graphics/bord_t.png", "graphics/bord_tl.png", "graphics/bord_r.png", "graphics/bord_l.png", "graphics/bord_br.png", "graphics/bord_b.png", "graphics/bord_bl.png"
|
||||
ForceTextInMenus = true
|
||||
TelefogHeight = 28
|
||||
// precache all intro sounds
|
||||
PrecacheSounds = "aa12/titlecock", "aa12/titlefire", "title/thump"
|
||||
// precache all intro textures, to avoid hiccups
|
||||
PrecacheTextures = "graphics/OniLogoL.png",
|
||||
"graphics/OniLogoL_Glow.png",
|
||||
"graphics/OniLogoL_Layers.png",
|
||||
"graphics/OniLogoR.png",
|
||||
"graphics/OniLogoR_Glow.png",
|
||||
"graphics/OniLogoR_Layers.png",
|
||||
"graphics/title_grad.png",
|
||||
"graphics/title_ibuki.png",
|
||||
"graphics/title_ibuki_dark.png",
|
||||
"graphics/title_ibuki_eye.png",
|
||||
"graphics/title_ibuki_smoke.png",
|
||||
"graphics/title_smoke_0.png",
|
||||
"graphics/title_smoke_1.png",
|
||||
"graphics/title_smoke_2.png",
|
||||
"graphics/title_smoke_3.png",
|
||||
"graphics/title_smoke_4.png",
|
||||
"graphics/title_smoke_5.png",
|
||||
"graphics/title_smoke_6.png",
|
||||
"graphics/title_smoke_7.png",
|
||||
"graphics/M_REDONI.png",
|
||||
"graphics/M_REDONI_Layers.png"
|
||||
}
|
||||
|
||||
ClearSkills
|
||||
|
||||
Skill chill
|
||||
{
|
||||
AutoUseHealth
|
||||
DamageFactor = 0.5
|
||||
EasyBossBrain
|
||||
SlowMonsters
|
||||
SpawnFilter = baby
|
||||
ACSReturn = 0
|
||||
Name = "$ONI_SKCHILL"
|
||||
}
|
||||
Skill easy
|
||||
{
|
||||
DamageFactor = 0.75
|
||||
SpawnFilter = easy
|
||||
ACSReturn = 1
|
||||
Name = "$ONI_SKEASY"
|
||||
}
|
||||
Skill normal
|
||||
{
|
||||
SpawnFilter = normal
|
||||
ACSReturn = 2
|
||||
Name = "$ONI_SKNORMAL"
|
||||
DefaultSkill
|
||||
}
|
||||
Skill hard
|
||||
{
|
||||
DamageFactor = 1.25
|
||||
SpawnFilter = hard
|
||||
ACSReturn = 3
|
||||
Name = "$ONI_SKHARD"
|
||||
}
|
||||
Skill hardcore
|
||||
{
|
||||
DisableCheats
|
||||
FastMonsters
|
||||
HealthFactor = 1.5
|
||||
DamageFactor = 1.5
|
||||
Aggressiveness = 0.25
|
||||
SpawnFilter = nightmare
|
||||
SpawnMulti
|
||||
ACSReturn = 4
|
||||
Name = "$ONI_SKHARDCORE"
|
||||
MustConfirm = "$ONI_SKHARDCORECONFIRM"
|
||||
}
|
||||
Skill lunatic
|
||||
{
|
||||
DisableCheats
|
||||
HealthFactor = 2.0
|
||||
DamageFactor = 2.0
|
||||
Aggressiveness = 1.0
|
||||
SpawnFilter = nightmare
|
||||
SpawnMulti
|
||||
TotalInfighting
|
||||
InstantReaction
|
||||
NoPain
|
||||
ACSReturn = 4
|
||||
Name = "$ONI_SKLUNATIC"
|
||||
MustConfirm = "$ONI_SKLUNATICCONFIRM"
|
||||
}
|
||||
|
||||
|
||||
Map TITLEMAP "RED ONI Title Map"
|
||||
{
|
||||
Music = ""
|
||||
EventHandlers = "OniTitleStuff"
|
||||
}
|
||||
|
||||
DamageType EndLevel
|
||||
{
|
||||
NoArmor
|
||||
Obituary = "$O_ENDLEVEL"
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
version "4.7.1"
|
||||
|
||||
/*
|
||||
RED ONI Main Codebase
|
||||
(C)2021 Marisa Kirisame, UnSX Team
|
||||
This copyright and the attached LICENSE.code file apply to all files
|
||||
included from here, with the exception of any third-party libraries
|
||||
*/
|
||||
|
||||
/// SWWM GZ Common Library
|
||||
// library constants
|
||||
const SWWMMODPREFIX = "oni";
|
||||
const SWWMMAXBACKPACK = 8;
|
||||
const SWWMHEALTHFLASH = Color(64,96,255);
|
||||
const SWWMARMORFLASH = Color(255,224,64);
|
||||
const SWWMLOGONAME = "M_REDONI";
|
||||
const SWWMCREDITSCOL0 = Font.CR_DARKRED;
|
||||
const SWWMCREDITSCOL1 = Font.CR_RED;
|
||||
const SWWMCREDITSCOL2 = Font.CR_DARKGRAY;
|
||||
// Gutamatics
|
||||
#include "zscript/swwm_Gutamatics/Include.zsc"
|
||||
// utility code
|
||||
#include "zscript/utility/swwm_coordutil.zsc"
|
||||
#include "zscript/utility/swwm_utility.zsc"
|
||||
// base code
|
||||
#include "zscript/swwm_common.zsc"
|
||||
#include "zscript/swwm_common_fx.zsc"
|
||||
#include "zscript/swwm_handler.zsc"
|
||||
#include "zscript/swwm_statichandler.zsc"
|
||||
#include "zscript/swwm_thinkers.zsc"
|
||||
#include "zscript/swwm_player.zsc"
|
||||
#include "zscript/swwm_blod.zsc"
|
||||
// handler code
|
||||
#include "zscript/handler/swwm_handler_damage.zsc"
|
||||
#include "zscript/handler/swwm_handler_flash.zsc"
|
||||
#include "zscript/handler/swwm_handler_iwantdie.zsc"
|
||||
#include "zscript/handler/swwm_handler_process.zsc"
|
||||
#include "zscript/handler/swwm_handler_queues.zsc"
|
||||
#include "zscript/handler/swwm_handler_replacements.zsc"
|
||||
#include "zscript/handler/swwm_handler_worldload.zsc"
|
||||
#include "zscript/handler/swwm_handler_worldthings.zsc"
|
||||
// menu code
|
||||
#include "zscript/menu/swwm_menus.zsc"
|
||||
#include "zscript/menu/swwm_credits.zsc"
|
||||
// compat code
|
||||
#include "zscript/compat/swwm_compat.zsc"
|
||||
// hud
|
||||
#include "zscript/hud/swwm_hudextra.zsc"
|
||||
// items
|
||||
#include "zscript/items/swwm_baseitem.zsc"
|
||||
#include "zscript/items/swwm_basehealth.zsc"
|
||||
#include "zscript/items/swwm_basearmor.zsc"
|
||||
#include "zscript/items/swwm_baseammo.zsc"
|
||||
#include "zscript/items/swwm_ammoextra.zsc"
|
||||
// weapons
|
||||
#include "zscript/weapons/swwm_baseweapon.zsc"
|
||||
#include "zscript/weapons/swwm_baseweapon_fx.zsc"
|
||||
#include "zscript/weapons/swwm_baseweapon_melee.zsc"
|
||||
// monsters
|
||||
#include "zscript/swwm_monsters.zsc"
|
||||
|
||||
/// RED ONI Specific Code
|
||||
// utility code
|
||||
#include "zscript/utility/oni_utility.zsc"
|
||||
// base code
|
||||
#include "zscript/oni_player.zsc"
|
||||
// handler code
|
||||
#include "zscript/handler/oni_handler_shaders.zsc"
|
||||
#include "zscript/handler/oni_handler_replacements.zsc"
|
||||
#include "zscript/handler/oni_statichandler_fonts.zsc"
|
||||
// menu code
|
||||
#include "zscript/menu/oni_title.zsc"
|
||||
#include "zscript/menu/oni_credits.zsc"
|
|
@ -0,0 +1,10 @@
|
|||
// Red Oni replacements
|
||||
|
||||
extend Class SWWMHandler
|
||||
{
|
||||
private bool ModReplacement( ReplaceEvent e )
|
||||
{
|
||||
// nothing here yet
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
extend Class SWWMHandler
|
||||
{
|
||||
private ui void RenderShaders( RenderEvent e )
|
||||
{
|
||||
// nothing here yet
|
||||
}
|
||||
|
||||
static clearscope void ClearAllShaders( PlayerInfo p, bool noscope = false )
|
||||
{
|
||||
// nothing here yet
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
extend Class SWWMStaticHandler
|
||||
{
|
||||
private void PreloadModFonts()
|
||||
{
|
||||
// nothing here yet
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
// mod credits
|
||||
|
||||
Class OniCreditsMenu : SWWMCreditsMenu
|
||||
{
|
||||
override void ChildInit( Menu parent )
|
||||
{
|
||||
cmusic.Push(new("SWWMCreditsEntry").Init(sfnt,"BouncyTEM","???"));
|
||||
cmusic.Push(new("SWWMCreditsEntry").Init(sfnt,"Teque","Rock Bug Opera"));
|
||||
}
|
||||
override String, int GetCreditsMus()
|
||||
{
|
||||
return "music/ibuki_titlemus.ogg", 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,258 @@
|
|||
// Things for the titlemap
|
||||
|
||||
Struct TitleSmoke
|
||||
{
|
||||
int age, maxage;
|
||||
Vector2 pos, vel;
|
||||
double ang, angvel;
|
||||
double scale;
|
||||
}
|
||||
|
||||
Class OniTitleStuff : EventHandler
|
||||
{
|
||||
ui TextureID bgtex;
|
||||
ui Font TewiFont, MPlusFont;
|
||||
ui CVar dofuzz;
|
||||
ui TextureID ibukitex[4];
|
||||
ui TitleSmoke smk[128];
|
||||
ui Shape2D smk_shape;
|
||||
ui Shape2DTransform smk_tform;
|
||||
ui TextureID smk_tex[8];
|
||||
ui TextureID logotex[4];
|
||||
ui TextureID gradtex;
|
||||
ui int quakestr;
|
||||
ui int rss;
|
||||
|
||||
private ui int GetUIRandom()
|
||||
{
|
||||
return (rss = (rss<<1)*35447+(rss/87));
|
||||
}
|
||||
|
||||
private ui double RandomShiver()
|
||||
{
|
||||
int sd = GetUIRandom();
|
||||
return ((abs(sd)%11)-5)*.1;
|
||||
}
|
||||
|
||||
// returns MPlus if we're playing in Japanese, otherwise returns the requested font
|
||||
private ui Font LangFont( Font req )
|
||||
{
|
||||
if ( language ~== "jp" ) return MPlusFont;
|
||||
return req;
|
||||
}
|
||||
|
||||
private ui void TickSmokeLayers()
|
||||
{
|
||||
for ( int i=0; i<128; i++ )
|
||||
{
|
||||
int presim = 0;
|
||||
if ( smk[i].age >= smk[i].maxage )
|
||||
{
|
||||
if ( smk[i].maxage == 0 ) presim = Random[UIStuff](0,60);
|
||||
else presim = -1;
|
||||
smk[i].age = Random[UIStuff](-20,0);
|
||||
smk[i].maxage = Random[UIStuff](60,120);
|
||||
smk[i].pos = (FRandom[UIStuff](-512.,512.),FRandom[UIStuff](0.,256.));
|
||||
smk[i].vel = (FRandom[UIStuff](-1.,3.),FRandom[UIStuff](-2.,-6.));
|
||||
smk[i].ang = FRandom[UIStuff](0.,360.);
|
||||
smk[i].angvel = FRandom[UIStuff](1.,4.)*RandomPick[UIStuff](-1,1);
|
||||
smk[i].scale = FRandom[UIStuff](256.,512.);
|
||||
}
|
||||
for ( int j=0; j<=presim; j++ )
|
||||
{
|
||||
smk[i].age++;
|
||||
if ( smk[i].age <= 0 ) continue;
|
||||
smk[i].pos += smk[i].vel;
|
||||
smk[i].ang += smk[i].angvel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override void UiTick()
|
||||
{
|
||||
quakestr = max(quakestr-1,0);
|
||||
if ( level.maptime == 1 ) S_ChangeMusic("music/ibuki_pretitlemus.ogg",looping:false);
|
||||
else if ( level.maptime == (43*GameTicRate) ) S_StartSound("aa12/titlecock",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
|
||||
else if ( level.maptime == (44*GameTicRate) ) S_StartSound("aa12/titlefire",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
|
||||
else if ( level.maptime == (46*GameTicRate) )
|
||||
{
|
||||
quakestr += 30;
|
||||
S_StartSound("title/thump",CHAN_BODY,CHANF_OVERLAP|CHANF_UI,1.,0.,1.);
|
||||
}
|
||||
else if ( level.maptime == (47*GameTicRate) )
|
||||
{
|
||||
quakestr += 30;
|
||||
S_StartSound("title/thump",CHAN_BODY,CHANF_OVERLAP|CHANF_UI,1.,0.,.8);
|
||||
}
|
||||
else if ( level.maptime == (50*GameTicRate) ) S_ChangeMusic("music/ibuki_titlemus.ogg");
|
||||
TickSmokeLayers();
|
||||
if ( gamestate != GS_LEVEL ) return;
|
||||
// you're not supposed to be here
|
||||
Menu.SetMenu('EndGameMenu');
|
||||
let m = MessageBoxMenu(Menu.GetCurrentMenu());
|
||||
if ( m ) m.HandleResult(true);
|
||||
// special thanks to marrub for this absolute crime
|
||||
}
|
||||
|
||||
// heh
|
||||
private clearscope double smerp( double a ) const
|
||||
{
|
||||
return (sin((a-.5)*180.)+1.)/2.;
|
||||
}
|
||||
|
||||
private ui void RenderSmokeLayer( RenderEvent e, double GameSecs, bool back, double alpha = 1., double disp = 0., bool zoomout = false )
|
||||
{
|
||||
if ( !smk_shape )
|
||||
{
|
||||
smk_shape = new("Shape2D");
|
||||
smk_shape.PushVertex((-1,-1));
|
||||
smk_shape.PushVertex((1,-1));
|
||||
smk_shape.PushVertex((-1,1));
|
||||
smk_shape.PushVertex((1,1));
|
||||
smk_shape.PushCoord((0,0));
|
||||
smk_shape.PushCoord((1,0));
|
||||
smk_shape.PushCoord((0,1));
|
||||
smk_shape.PushCoord((1,1));
|
||||
smk_shape.PushTriangle(0,3,1);
|
||||
smk_shape.PushTriangle(0,2,3);
|
||||
}
|
||||
if ( !smk_tform ) smk_tform = new("Shape2DTransform");
|
||||
double zoomscl = Screen.GetHeight()/(zoomout?600:400.);
|
||||
int imin = back?64:0;
|
||||
int imax = back?128:64;
|
||||
int base = zoomout?(back?450:750):(back?500:300);
|
||||
for ( int i=imin; i<imax; i++ )
|
||||
{
|
||||
if ( !smk_tex[i%8] ) smk_tex[i%8] = TexMan.CheckForTexture("graphics/title_smoke_"..(i%8)..".png",TexMan.Type_Any);
|
||||
smk_tform.Clear();
|
||||
// base transforms
|
||||
smk_tform.Scale((1,1)*smk[i].scale);
|
||||
smk_tform.Rotate(smk[i].ang+smk[i].angvel*e.FracTic);
|
||||
smk_tform.Translate(smk[i].pos+smk[i].vel*e.FracTic);
|
||||
// screen transforms
|
||||
smk_tform.Translate((0,base+disp));
|
||||
smk_tform.Scale((1,1)*zoomscl);
|
||||
smk_tform.Translate((Screen.GetWidth()/2,0));
|
||||
smk_shape.SetTransform(smk_tform);
|
||||
double alf = cos((smk[i].age/double(smk[i].maxage))*90)*alpha;
|
||||
alf *= clamp(smk[i].age/10.,0,1);
|
||||
Screen.DrawShape(smk_tex[i%8],false,smk_shape,DTA_Alpha,alf,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,Color(4,16,48));
|
||||
}
|
||||
}
|
||||
|
||||
override void RenderUnderlay( RenderEvent e )
|
||||
{
|
||||
double GameSecs = (level.maptime+e.FracTic)/GameTicRate;
|
||||
if ( !dofuzz ) dofuzz = CVar.FindCVar(SWWMMODPREFIX.."_fuzz");
|
||||
if ( dofuzz.GetBool() )
|
||||
{
|
||||
if ( !bgtex ) bgtex = TexMan.CheckForTexture("graphics/tempbg.png",TexMan.Type_Any);
|
||||
Vector2 tsize = TexMan.GetScaledSize(bgtex);
|
||||
double zoom = max(ceil(Screen.GetWidth()/tsize.x),ceil(Screen.GetHeight()/tsize.y));
|
||||
Vector2 vsize = (Screen.GetWidth(),Screen.GetHeight())/zoom;
|
||||
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(128,0,0,0));
|
||||
Screen.Dim(Color(16,0,0),1.-clamp((GameSecs-44),.1,1.),0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
}
|
||||
else Screen.Dim(Color(16,0,0),1.,0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
double alf;
|
||||
String str;
|
||||
double zoomscl = Screen.GetHeight()/400.;
|
||||
double texscl = Screen.GetHeight()/2700.;
|
||||
double logoscl = max(floor(Screen.GetHeight()/1024.),1.);
|
||||
// intro texts
|
||||
if ( level.maptime < (42*GameTicRate) )
|
||||
{
|
||||
if ( !ibukitex[0] ) ibukitex[0] = TexMan.CheckForTexture("graphics/title_ibuki_dark.png",TexMan.Type_Any);
|
||||
alf = clamp(GameSecs/40.,.2,1.);
|
||||
double disp = smerp(clamp((GameSecs-16)/25.,0,1));
|
||||
RenderSmokeLayer(e,GameSecs,true,clamp(alf*2.,.2,1.),200.*disp);
|
||||
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700.*disp,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl,DTA_ColorOverlay,Color(255-int(alf*255),0,0,0));
|
||||
RenderSmokeLayer(e,GameSecs,false,clamp(alf*2.,.2,1.)*.5,400.*disp);
|
||||
if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded');
|
||||
if ( !MPlusFont ) MPlusFont = Font.GetFont('MPlusShaded');
|
||||
Font fnt = LangFont(TewiFont);
|
||||
alf = clamp(GameSecs-1,0.,1.);
|
||||
alf *= 1.-clamp(GameSecs-6,0.,1.);
|
||||
String str = StringTable.Localize("$ONI_TITLEPRESENTSA");
|
||||
Screen.DrawText(fnt,Font.CR_DARKRED,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
str = StringTable.Localize("$ONI_TITLEPRESENTSB");
|
||||
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
alf = clamp(GameSecs-8,0.,1.);
|
||||
alf *= 1.-clamp(GameSecs-13,0.,1.);
|
||||
str = StringTable.Localize("$ONI_TITLEMODBYA");
|
||||
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
str = StringTable.Localize("$ONI_TITLEMODBYB");
|
||||
Screen.DrawText(fnt,Font.CR_DARKRED,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
alf = clamp(GameSecs-20,0.,1.);
|
||||
alf *= 1.-clamp(GameSecs-35,0.,1.);
|
||||
str = StringTable.Localize("$ONI_TITLEINTROA");
|
||||
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
str = StringTable.Localize("$ONI_TITLEINTROB");
|
||||
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
|
||||
}
|
||||
// 42 seconds in: eye glow
|
||||
else if ( level.maptime < (44*GameTicRate) )
|
||||
{
|
||||
RenderSmokeLayer(e,GameSecs,true,1.,200.);
|
||||
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl);
|
||||
RenderSmokeLayer(e,GameSecs,false,.5,400.);
|
||||
if ( !ibukitex[1] ) ibukitex[1] = TexMan.CheckForTexture("graphics/title_ibuki_eye.png",TexMan.Type_Any);
|
||||
alf = clamp((GameSecs-43)*4.,0.,1.);
|
||||
Screen.DrawTexture(ibukitex[1],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl,DTA_Alpha,alf,DTA_LegacyRenderStyle,STYLE_Add);
|
||||
alf *= 1.-clamp((GameSecs-43),0.,1.);
|
||||
Screen.Dim("Red",(alf**2)*.3,0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
}
|
||||
// 44 seconds in: fade from white to full title scene
|
||||
else
|
||||
{
|
||||
if ( level.maptime > 46*GameTicRate )
|
||||
{
|
||||
if ( !logotex[0] ) logotex[0] = TexMan.CheckForTexture("graphics/OniLogoL.png",TexMan.Type_Any);
|
||||
if ( !logotex[2] ) logotex[2] = TexMan.CheckForTexture("graphics/OniLogoL_Glow.png",TexMan.Type_Any);
|
||||
Screen.DrawTexture(logotex[0],false,Screen.GetWidth()/2-320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,580);
|
||||
if ( level.maptime < 48*GameTicRate )
|
||||
Screen.DrawTexture(logotex[2],false,Screen.GetWidth()/2-320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,580,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,1.-clamp(GameSecs-46,0.,1.));
|
||||
}
|
||||
if ( level.maptime > 47*GameTicRate )
|
||||
{
|
||||
if ( !logotex[1] ) logotex[1] = TexMan.CheckForTexture("graphics/OniLogoR.png",TexMan.Type_Any);
|
||||
if ( !logotex[3] ) logotex[3] = TexMan.CheckForTexture("graphics/OniLogoR_Glow.png",TexMan.Type_Any);
|
||||
Screen.DrawTexture(logotex[1],false,Screen.GetWidth()/2+320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,540);
|
||||
if ( level.maptime < 49*GameTicRate )
|
||||
Screen.DrawTexture(logotex[3],false,Screen.GetWidth()/2+320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,540,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,1.-clamp(GameSecs-47,0.,1.));
|
||||
}
|
||||
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/title_grad.png",TexMan.Type_Any);
|
||||
Screen.DrawTexture(gradtex,false,0,Screen.GetHeight(),DTA_DestWidth,Screen.GetWidth(),DTA_DestHeight,256*CleanYFac_1,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,Color(128,0,0),DTA_TopOffset,256);
|
||||
RenderSmokeLayer(e,GameSecs,true,.5,0,true);
|
||||
if ( !ibukitex[2] ) ibukitex[2] = TexMan.CheckForTexture("graphics/title_ibuki.png",TexMan.Type_Any);
|
||||
if ( !ibukitex[3] ) ibukitex[3] = TexMan.CheckForTexture("graphics/title_ibuki_smoke.png",TexMan.Type_Any);
|
||||
alf = clamp((GameSecs-44.5)*1.5,0.,1.);
|
||||
rss = int(MSTime()/GameTicRate);
|
||||
Vector2 ofs = (RandomShiver(),RandomShiver())*quakestr*texscl;
|
||||
if ( alf < 1. )
|
||||
{
|
||||
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_Alpha,1.-alf);
|
||||
Screen.DrawTexture(ibukitex[2],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_Alpha,alf);
|
||||
}
|
||||
else Screen.DrawTexture(ibukitex[2],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl);
|
||||
alf = clamp((GameSecs-44.)*.5,0.,1.);
|
||||
Screen.DrawTexture(ibukitex[3],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf*.5);
|
||||
Screen.DrawTexture(ibukitex[1],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_LegacyRenderStyle,STYLE_Add);
|
||||
RenderSmokeLayer(e,GameSecs,false,1.,0,true);
|
||||
Screen.DrawTexture(gradtex,false,0,Screen.GetHeight(),DTA_DestWidth,Screen.GetWidth(),DTA_DestHeight,64*CleanYFac_1,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(128,0,0),DTA_TopOffset,256);
|
||||
if ( level.maptime < (45*GameTicRate) )
|
||||
{
|
||||
alf = 1.-clamp((GameSecs-44),0.,1.);
|
||||
Screen.Dim("White",alf,0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
}
|
||||
if ( quakestr > 0. )
|
||||
{
|
||||
alf = (quakestr-e.fractic)/60.;
|
||||
Screen.Dim(Color(255,64,0),alf,0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
}
|
||||
}
|
||||
// global fade in from back
|
||||
if ( level.maptime < (1*GameTicRate) )
|
||||
Screen.Dim("Black",1.-clamp(GameSecs,0.,1.),0,0,Screen.GetWidth(),Screen.GetHeight());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
Class IbukiPlayer : SWWMPlayer
|
||||
{
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
// mod-specific utility code
|
||||
extend Class SWWMUtility
|
||||
{
|
||||
// IsZeroDamage() can lead to some false negatives, we have to account for that
|
||||
static play bool ValidProjectile( Actor a )
|
||||
{
|
||||
if ( !a.bMISSILE ) return false;
|
||||
// TODO add mod projectiles here
|
||||
if ( !a.IsZeroDamage() ) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO slot replacers
|
||||
}
|