From ef44030a6cd3942234c431b5bb8496dc54a12167 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 5 Mar 2026 11:02:47 +0000 Subject: [PATCH] Autosave: 20260305-110247 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5552 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1660 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes config/urls.py | 3 +- core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 212 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 3607 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 685 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2101 bytes core/migrations/0001_initial.py | 63 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3402 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 42 +++++++++++- core/templates/base.html | 38 +++++++---- core/templates/core/scene_detail.html | 36 ++++++++++ core/templates/registration/login.html | 34 ++++++++++ core/urls.py | 10 ++- core/views.py | 55 +++++++++------ static/css/custom.css | 26 +++++++- 22 files changed, 264 insertions(+), 43 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/scene_detail.html create mode 100644 core/templates/registration/login.html diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 896bb4f1b8949c96d2f1bf743293342b70a9d0e4..78a49192428c7555acb4858cd5831da020c556a9 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}xD(T{)3^3IHrm1mFMw delta 19 ZcmbQwIG>SwIWI340}#~tteD6>1pq5}1i1hJ diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index d79d6a79890a58443ee5f65d8d558823a19e9aed..e0c05e285826cf299b2b363cf9074ae122d6ad47 100644 GIT binary patch delta 20 acmdm>y+NCMIWI340}xD(UAd8asVD$CR0W&> delta 20 acmdm>y+NCMIWI340}#~ttk}rCR1^R?Rt0qc diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 8cf22af743397374cabf5fa358c4f52631471db9..99f208a179bb309e55fe537b9c3ddf6a7b221f0a 100644 GIT binary patch delta 258 zcmbQr^M^-$IWI340}$LuT$!1{!octt#DM`0DC4uyMD>0iCWchj6iy(?lEO7{maHyw z6i+I97B5V3kx42@31{)y;1u0xr z+zbqBxFicD5ulxGC7L^*ka8B%~)lXr6*<9?>iPAqDSOdlC0XR+2yViVzDW#(sU M;QqihS%xhE03@dwPyhe` diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index a1b4aa75cef92df0f6f3c8f77e2be44ec1b36534..cc933db119198d3f0d726bb4a3bf57992846d8bb 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}xD(UAd8a4if+~fdwJ} delta 20 acmZ3^x}24JIWI340}#~ttk}pshY0{Og9Q5k diff --git a/config/urls.py b/config/urls.py index bcfc074..a379960 100644 --- a/config/urls.py +++ b/config/urls.py @@ -20,7 +20,8 @@ from django.conf import settings from django.conf.urls.static import static urlpatterns = [ - path("admin/", admin.site.urls), + path('admin/', admin.site.urls), + path('accounts/', include('django.contrib.auth.urls')), path("", include("core.urls")), ] diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 3f553f6185fe97866ef932cffccb11efab5e8ef0..6ded48082f05943c25b6096d67d312cfbab2aad5 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}xD(T{)3^5&$d(1lj-q delta 19 ZcmbQsIG2%oIWI340}#~tteD6>2>>fD1hW7D diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 5e8987a0cd478c226e501b5189550e758662c560..9b8bdc232c75e02030701b9395cc87f8aaa2d0e6 100644 GIT binary patch delta 19 Zcmcb@c!iOBIWI340}xD(T{)5aBmgt`1%Chl delta 19 Zcmcb@c!iOBIWI340}#~tteD7s5&$zH1y}$8 diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 2fa4a49f9779402d93d4c58688d65ede2fff84d5..dd90d79889b109058b9ae4183b48ca74d5f124e7 100644 GIT binary patch delta 20 acmeBS>0#ks&dbZi00fg`S8n8HWC8##B?M0Z delta 20 acmeBS>0#ks&dbZi00ebDD>ia7G64WBCj=+} diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..c2cf1adcdbce21d0cd5529c25514bb6081b0f434 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}xD(UAd9_0}}v1p#~lR delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index a251b5fb7c2b603c587f8162d643eb10596d2858..6752a449def4e3015be36ef7fcdc694294141041 100644 GIT binary patch literal 3607 zcmcIm%}*Og6yLSI{#+Y_oirb$5J;#D3AAY-QI$4I2~KGUO@%?K+h%3F1DGtkWOhwL zidr9f;J|@Hr9_n~aiTi?L-=V=c@MYh=D2nEIU_AFDFLLshe&yulnAxe z=M4OGknmRKt8lYknQ&$90G>B(x8^f(95Jv(pvBuO`@Bs~_(t-NT81?Uy8c zuO!()NdiTA1@A>kdXUd3&I(1t?Lhxjh9+}Fk*Ub$De}l*b2}sxJxg=5Mov>He&92X zHo=89AmAx7K%VJe02E&Tl|rW%`>fFE72OPV6+>NCsHz^3OHhA(r$2?2|IX=*5_pts$nFhK4QT>LN(5zyrgTX50&#q{@O7Smw|t+Y~Pp#S4~rp)gR(hf=hC*=t4H*9Oe!rDF7w6}?m# zEX6vO`>a^UTHcKH7Gu3uthX?P%sGY3sRhRzG@?Fp{>OA7jAV&QwqC%ynb+UZ)3gOQ z*7q{gT=6oxiJnEkqlZv`3*Xwltfm@7HR?L91C=2lKWYQHuHz!_FHTsI_luEME7DrH zb%Z-mb(K3XGH~qt3h<^tCW6fG&()C2fwlX}7?d7ZKRR$RJ+T2A1=zugEIyFEvUkI` z3Z-?uQeH8L{SeBc9Dq;`+TQ*tEte&5e(b6zT((Gwl7Sdt>D3NsssvREf`WbkDw*f) zXikMt$*Gf4d0Q&sp%-zv8vqJIUQujeT*;{S-;pI)P7KJ;^@$R3tgSGm72k+Sq0E$U zJ*L>fB$S%mq-AA%D45dbXUWeZyr+6+*ioTp%=y3?7)9c+wntZYG; zc=FJ**?vUqHtG}hSe0QF-gbg29W!CMt+5);n*Ot8636S3IQ*4LQW}8M$l#IFUW88( zE+eokcLnb3a5hgVBtwV4cEg>FI-k-Io!v+dJCIZ7Kt`kUtftxC2Uyf~TO5Q$I!T<4 z$rcncN0ho*^%Hz4LOcBQ-vIW7K&S=Vqm~uVruTWo3|%jVu3Mq&&?3dpFDI?|`4zG` z_xz_9Df64}&G@}y{GJuRSGZG(c3^?*STQy)o6)Pq=v6Cv6-s2deR0eRx33Ir#?5eF zG2CZ``wGdD*n)A^vc{WYXHo35#LmJ121*-N&RTFPC)zskr q=cuARQse0Og#>gVCa55jWt7q9`I@77slKKU2Wi0P96 delta 151 zcmbO(bCEH9IWI340}#~ttjM$k(vLwL7+``jJ_`XE(-~42QW$d>av7r-85vTTf*CZK zUxE~9GTvg#%}+_qDfZK3y2Y82m6(^Fua}Zk#0->N$?zGZX7X!B1F>HmHb8ZyIjMF< a96&KfATE|=n9Rs4$$f!A28fE-fIljA6vyx4=hTj4Dq0W>2%$oTNT??vA*874RHRH?Ezg=YmzJf+3HX zVq!01qr0ikVn+6YIO{E>8_<1HwQEgT<^|!XSwofW=R&YJa~J;TokqEyX914~U9+<2u@@il-CTsJP(u=`AE5?V8D5gOsu-dELDj0SRz-`p3Rp5p_LDIY zr|0NOhS2p>qPigY>paeK!rn7K&$u8bT)a&a&u2t6OVn+<$%kuWFXA*0*}k|Vlhs(# zQ~8=}7~>gwP^|A6+Ah}jZ|nBhm^YDbjt?eVlUE;|(>DclrqC&&GXrCMP?(R-I_1u@ zi-!gDr_e8645lzBVK6uK&BoYLOKi#F F{sNIbx3B;J delta 251 zcmZ3>dYegoIWI340}#~ttjNp)(vLwL7+{4mKHE%Gm#t@FNM%f6No7u9UBkAFnSo(7 z5JNyZV-!mYdoY70$4iiaCgUxZg2a-HmyA$OMt*MUErueHaUi+8#N1RrP1al7DOrhm z>G^u4MLESqAj594mSv`v7lRev;sy!>O({t&$}3*U@R?!qaYh?1KAR1PW*41r=u-cCm~5_&yI?hY=ENke^vkX%@kG1GcxC zTXM{b$`R@T0>xUz@L0omw8RVy)&_B>%u7_wD79hV#tPih&>4 zx#hJ$q}HStmP#<}OTaeKk=(a4>Ro=TE@yo?>xtPD5Th9_+7rCRVXz$LAnq=5QJLB> zDo6Qj@GeJgJJfZHoLGB?kjp(elk0}y3NBxy=flY5_d3?LrRYorx>mi?a~Sk;vxL)Kw2<}?Sx>H$OXC}5k@t1(odaG%mgws3tiZ>X4fbY zh3a}jdx|-76$A+w_V2(p(Nm@W;g`NLy7^Hfo@ydRnmS6q`peD7pLpqsdV0c7Pi#w# zksI4FKXIjz=>1OqR{lnLsBFXUX?nm<-vD*0zlq|>siVxuqwHUq?4OxzJ(Kq{`R(aO zD$_)gGSwKpy%PiDMtWdZ{z3j;`BB+X8bhz`NITN;;MJcNz0r5-gOmQ?q?evN4#EHS zA2o0Gb8q4vJau`_m*+fjj-+7MU2Q;*k+s1ym~^+Y)6p*f0d*c)CbB3;MF;S9K$*PT z`Q{46s2yBkF9J1$j;I^T9CGNETcq=y-paHNjGhSR0NS}q+=qrfjGCIkl2C-N_fZf| zh2;%F2=~%us=3HCUC2_CA?RpW@(N`Gz=EDCUTtBI3{vS3Wi(H65tu55pi64(qAePF z5DTXaeKsw?Dby5DSvD?~G{>;2A2Rf4o$E>#z;oV{cb2kv5H0gCeO_AerO%$;h;?qsOkNbjaqEr5l0OGCTmg0406X$M0>vFduU0cAUESY}+ Dv%Aou literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1+$K)2Q%ZHHP<`ZWm8k%0`!Liw{@%1fY!tdJefM7AQl zBhn19Sa6Ea_&F0f52+#t(zs7E+?3c%aE4Gt31lN`$cK>CaWDY%0l$fN{S4(m*^98b zAQFOZ8L?*M5b8J{)dItqY^-hhUDsF{YgW-QOsAxII>p%0Y9=dd7Ae9|G&s?)vtv@? z*w|s3fmzYCyi6leblsZSXw)-0vAJ^Fb$=8ZkKM6~%pxUIZ^SlnP1|O53-h^$TMxcl z&pj%9yS|;<+IaYARqQc33p$+=>?7eip%aJUUFM01nxMCzWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+Sj0BfPw>ijEJJ5jZcy4+QlU#Tl6>PkmVchz)jqo<{g zem>D|w6z=i>HYM}h1U1|$#c)H{hoQ2Y2^ko`uNk{{Bl3J(n+Sf$#g%t+)aMbNnYMq_I%*JNq0Rq;#`{q1K zoZG+JUbuEt>cm&O@zr)@^%Rl>0Md)F(RpB8KAS2P06puedS=OZWkMOW!1G(l6GL;A z0R;Uy__hCq=p}LW6JT$Zn>I137G9%QKox%h?+LI$Sdye3inaW&hh|#-_ZofP9$!6l Xr9HlS=yH2}4P;gNa)91vejfh;`i@)& diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..324432c --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,63 @@ +# Generated by Django 5.2.7 on 2026-03-05 10:42 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('description', models.TextField()), + ], + ), + migrations.CreateModel( + name='Quest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('description', models.TextField()), + ('is_active', models.BooleanField(default=False)), + ('is_completed', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Scene', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('content', models.TextField()), + ], + ), + migrations.CreateModel( + name='PlayerProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(default=1)), + ('inventory', models.ManyToManyField(blank=True, to='core.item')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('quests', models.ManyToManyField(blank=True, to='core.quest')), + ('current_scene', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.scene')), + ], + ), + migrations.CreateModel( + name='Choice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(max_length=200)), + ('next_scene', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='incoming_choices', to='core.scene')), + ('scene', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='choices', to='core.scene')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..990aa80c8a3b8222aa8b214af515292cf7615208 GIT binary patch literal 3402 zcmb_eO;FoN7M5g7{=pKnURdajK#cR@;ckl1Gvu zq-v{j*s9&*+?Hcb>`sLPhdFTALymK7SM`DF!`4*IDL1FWX-@OHZ8?8zk!)7Bo?f@! z&-dQzeyx9YcSi-da`(S8{sY`kY~WvVn|Zki%s&KO&_z=yitv<7sTwE-L^c;NgH^dG zSCyh73X<@Zpa=gd=rWSmL%yM%fFL}DyLA;qy0|Q4mFH}@kQHgzMV@C^6*nujvBhxLl_4uQwJ$U(jkYPd`Pf^mvVn7m5aNWl&AmugxBKU{9bydV-n9D}| z8C}wuc67a~Gb8Gv9@OPsWe5B`g}Zf?B|XF?WB!aD-i_?MVIO3oT&CNX*#YLMKM=}N zC9vDIBf%Wpt?Mm3u@Au0{qcD86WqoLAB`T|J^4;d@#AGG@-cBGJ|eE3Bl7$S$MnDF zx%UI`oZ`Mtc5>8rM2`BoOuQo_>Zf;;Z&n&sM~X`&d@0nk{)x}8^WDfs>%E=1Q$F|l zn%*6F$L`=e-akFUdzwr2`8Hvli^n49???~rX5QWr73G+!4}UxBSd2x$XT^rq*_`P z(IBJGbtn>a(`Z$DsG7*Ccx$vvM{db6YOJ4TC5J6us+0|6>MoV<){*N`*)u#7(TL%y zTFEmu5SR$*sI1jZkH%oOWLIk@VqoOu60*?qADER;$+kRXd9-`c)V7eb=-6cg?8qkC zK<0DSY{90r0V1}u^(a!Z9W-V@tkC1-Ra3JbP|34tunsZ7RK&Ja==I>n8Rj6rVc^_H zQLe`aw7XPy9I&Ul3`YAE=d(d4!?c1{-87xEz_zXA*KDH%`SH+0k47z^EoB-vEQkxv z9JRzn+^oz^IOmu$vp{1GGFc6Hid*(%?hRsZ>jYZ9F8B@?vPl|Nxq_V(FbWx#;Xx%GcCOG~cT=m?v{ew)Q4Lu-vPxSHJ1*(T>B7p_YGHYHNu9ql zGkcrHIuZtQX;+>vlX-SbI&3x5*ma{a4GUh{0zDmQqV6d`iC_lZNpPree(K#ryQL%2p zY7H;XuBZ!z+qY@duA%ms{+;j=U?+O?AwBqFfi`lAX|?+zaLNZJpQVw2$A!DkCO1`{|b}y*Baqz z5}s}bq+aFm?PgSn46%3VgGB$2iBq_L^xF;6Ke`|MVFVXdY&p2!ZS=dO-^FncWN52W%aQa#!eT}5A;rR4H zVh9gUKItRFlluicoNo;0$#5RWXPR9K0~lcdfgCc@?EOChOyR*Vw&%#;7mdL&GB}3g zx#RMYdB1#IWcj$br{UC8BQ-@*Q#gKw$3DqopWL5(b_=H$8|g)oUc~Xcykr+y$u90I z|BjHUugTP1GWBPCzfA6L;N)f_xk-|nIR5Y;k;DTN+n33}#D4JEARbs~3@ng=1suO~ zkjUUOm!6y>XD;oJJX^tqd!%rm6c8y`q_Ei(gujS4BzT;?DZSwIkW-jR+>)BzA(rMS zOEZu|Mw)%E(wuycxc}?2`xFn2Z*P#H@jdU^2wwUVS-MA-R>{%>vgCpL8R-uU*FCAi z9+@=;4=BI`%HSE&K>`-p1(wtcd*$y9a(RwizC$km5tnTcsEgA~Zs0o81PYo!nPy&U zMr0OPm<0ypkdfxRnCnp<-(){$*58@gFip1F#hAW2*7}wo^LvK#TM&cuiMNw6I84f| zju+`@@aD+7T5Gewn-gug#pt c!V&+b@+(nk3h$C{qa;4^g1tCA;w?w@3otBQSO5S3 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 799581567d2858c54584d0675ede42b2d728f5cb..f0424f9ebf65519b2b6c68d123059c0d83dcd4ec 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}xD(T{)3^E&wf@1p5F0 delta 19 ZcmZ3%xPp;;IWI340}#~tteD6>7XU291k?Zk diff --git a/core/models.py b/core/models.py index 71a8362..825aa53 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,43 @@ from django.db import models +from django.contrib.auth.models import User -# Create your models here. +class Item(models.Model): + name = models.CharField(max_length=100) + description = models.TextField() + + def __str__(self): + return self.name + +class Quest(models.Model): + title = models.CharField(max_length=100) + description = models.TextField() + is_active = models.BooleanField(default=False) + is_completed = models.BooleanField(default=False) + + def __str__(self): + return self.title + +class Scene(models.Model): + title = models.CharField(max_length=200) + content = models.TextField() + + def __str__(self): + return self.title + +class Choice(models.Model): + scene = models.ForeignKey(Scene, related_name='choices', on_delete=models.CASCADE) + text = models.CharField(max_length=200) + next_scene = models.ForeignKey(Scene, related_name='incoming_choices', on_delete=models.SET_NULL, null=True, blank=True) + + def __str__(self): + return self.text + +class PlayerProfile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + current_scene = models.ForeignKey(Scene, on_delete=models.SET_NULL, null=True, blank=True) + inventory = models.ManyToManyField(Item, blank=True) + quests = models.ManyToManyField(Quest, blank=True) + level = models.IntegerField(default=1) + + def __str__(self): + return self.user.username \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..0767493 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -3,23 +3,33 @@ - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} + + {% block title %}Witcher RPG{% endblock %} {% load static %} - + + + {% block head %}{% endblock %} - - {% block content %}{% endblock %} + + +
+

Witcher RPG

+ +
+ +
+ {% block content %}{% endblock %} +
+ +
+ © 2026 Dark Fantasy RPG Engine +
+ - + \ No newline at end of file diff --git a/core/templates/core/scene_detail.html b/core/templates/core/scene_detail.html new file mode 100644 index 0000000..3252b29 --- /dev/null +++ b/core/templates/core/scene_detail.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load static %} +{% block content %} +
+
+
+

{{ scene.title }}

+

{{ scene.content }}

+
+ +
+ {% for choice in scene.choices.all %} + {{ choice.text }} + {% endfor %} +
+
+
+
+

Character Status

+

Level: {{ player.level }}

+

Quests

+
    + {% for quest in player.quests.all %} +
  • {{ quest.title }} - {{ quest.is_completed|yesno:"Completed,Active" }}
  • + {% endfor %} +
+

Inventory

+
    + {% for item in player.inventory.all %} +
  • {{ item.name }}
  • + {% endfor %} +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html new file mode 100644 index 0000000..3242471 --- /dev/null +++ b/core/templates/registration/login.html @@ -0,0 +1,34 @@ +{% extends "base.html" %} + +{% block title %}Sign In | Witcher RPG{% endblock %} + +{% block content %} +
+

Sign in to continue

+

Enter your credentials to resume your journey.

+ + {% if form.non_field_errors %} +
+ {{ form.non_field_errors }} +
+ {% endif %} + +
+ {% csrf_token %} + + + + + + +
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..e39ce96 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,11 @@ from django.urls import path +from . import views -from .views import home +app_name = 'core' urlpatterns = [ - path("", home, name="home"), -] + path('', views.home, name='home'), + path('scene//', views.scene_view, name='scene_detail'), + path('scene/', views.scene_view, name='current_scene'), + path('choose//', views.choose_action, name='choose_action'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..bdfae89 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,36 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone - +from django.shortcuts import render, get_object_or_404, redirect +from .models import Scene, Choice, PlayerProfile +from django.contrib.auth.decorators import login_required def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + return render(request, "core/index.html") - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) +@login_required +def scene_view(request, scene_id=None): + player = request.user.playerprofile + if scene_id: + scene = get_object_or_404(Scene, id=scene_id) + player.current_scene = scene + player.save() + else: + scene = player.current_scene + if not scene: + first_scene = Scene.objects.first() + if first_scene: + player.current_scene = first_scene + player.save() + scene = first_scene + else: + return render(request, "core/empty.html") + + return render(request, "core/scene_detail.html", {"scene": scene, "player": player}) + +@login_required +def choose_action(request, choice_id): + choice = get_object_or_404(Choice, id=choice_id) + player = request.user.playerprofile + if choice.next_scene: + player.current_scene = choice.next_scene + player.save() + return redirect('core:scene_detail', scene_id=choice.next_scene.id) + return redirect('core:current_scene') \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..82eaa95 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,26 @@ -/* Custom styles for the application */ body { - font-family: system-ui, -apple-system, sans-serif; + background-color: #0F1310; + color: #E0E0E0; + font-family: 'Inter', sans-serif; } + +h1, h2, h3 { + font-family: 'Cinzel', serif; + color: #B68D4C; +} + +.btn-accent { + background-color: #B68D4C; + color: #0F1310; + border: none; + padding: 10px 20px; + text-transform: uppercase; + font-weight: bold; +} + +.card { + background-color: #1C2320; + border: 1px solid #333; + padding: 20px; + margin-bottom: 20px; +} \ No newline at end of file