Jump to content
IGNORED

TI BASIC Game: Aperture


adamantyr

Recommended Posts

Normally I keep my projects under wraps until they're closer to completion... but the lack of posts and stated entries for this truly CHALLENGING contest requires a little preview.

 

I plan on entering three games, if I can find the time to fashion all three. One will be turn-based strategy, another a side action style, a third a top-down action style.

 

So, here's the name and a mocked up screenshot for what the final game will HOPEFULLY look like... it depends on how much memory I got to spare on features, and how much drag tracking multiple objects creates.

 

post-17978-128986308064_thumb.png

 

Synopsis:

 

You are test subject #99 of the Aperture research and development program, providing quality assurance for new military products. Your most recent acquisition is the Aperture gun, a device capable of creating a twin pair of gates in the fabric of the universe, allowing instant travel between two points.

 

Unfortunately, the base you're working in has suffered a serious malfunction brought on by a power surge. The main computer responsible for maintaining the complex has sealed the entire complex from the outside and closed itself off from access. The other personnel are dead or trapped... only you can reach the central processing unit and shut down the computer!

 

Requirements: TI Console, cassette player. (POTENTIALLY the Terminal Emulator II... I'd call that a special edition)

 

UPDATE:

 

Finished ZIP file containing both cassette and diskette versions of Aperture, as well as a DSK image for MESS and CF cards:

APERTURE.zip

Edited by adamantyr
  • Thanks 1
Link to comment
Share on other sites

Did some work on this tonight... So far my program is around 3500 bytes in size. I'm not sure how many "test chambers" there will be yet, as many as I can squeeze in to memory.

 

As a short sneak-peek, here is my code so far. This allows you to move around, go up and down a ladder, fire orange and blue portals and traverse them, and move a cube around.

 

 

 

100 DIM DX(2),AR(2),AC(2),AD(2)
110 DX(0)=1
120 DX(1)=-1
130 CALL CLEAR
140 FOR I=1 TO 23
150 READ C,C$
160 CALL CHAR(C,C$)
170 NEXT I
180 FOR I=1 TO 16
190 READ F,B
200 CALL COLOR(I,F,B)
210 NEXT I
220 PRINT TAB(10);"APERTURE": : : : : : : : : : : : : :
230 PRINT "   PRESS ANY KEY TO START"
240 CALL KEY(0,K,S)
250 IF S=0 THEN 240
260 L=1
270 GOSUB 8000
290 X=Y=D=AR(0)=AR(1)=AC(0)=AC(1)=T=0
300 B=97
500 CALL VCHAR(R,C,D+144)
501 GOSUB 5000
510 IF B=99 THEN 570
520 CALL GCHAR(R+1,C,G)
530 IF G<>97 THEN 570
540 Y=1
550 X=0
560 GOTO 720
570 Y=0
600 CALL KEY(3,K,S)
610 IF K=83 THEN 800
620 IF K=68 THEN 830
630 IF K=69 THEN 860
640 IF K=88 THEN 900
650 IF K=66 THEN 1000
660 IF K=79 THEN 1020
680 GOTO 510
700 CALL GCHAR(R+Y,C+X,G)
701 IF G=104 THEN 1200
702 IF G=112 THEN 1230
703 IF(G=120)+((G>=136)*(G<=138))THEN 1500
704 IF G=128 THEN 2000
710 IF(G<>97)*(G<>99)THEN 510
720 CALL VCHAR(R,C,B)
730 R=R+Y
740 C=C+X
750 B=G
760 GOTO 500
800 X=-1
810 D=1
820 GOTO 700
830 X=1
840 D=0
850 GOTO 700
860 IF B<>99 THEN 510
870 Y=-1
880 X=0
890 GOTO 700
900 CALL GCHAR(R+1,C,G)
910 IF G<>99 THEN 600
920 Y=1
930 X=0
940 GOTO 720
1000 PO=0
1010 GOTO 1030
1020 PO=1
1030 CALL VCHAR(R,C,D+146)
1035 PX=DX(D)
1040 PR=R
1050 PC=C+PX
1060 CALL GCHAR(PR,PC,G)
1070 IF G=96 THEN 1110
1080 IF(G<>97)*(G<>99)*(G<>128)THEN 500
1090 PC=PC+PX
1100 GOTO 1060
1110 IF AR(PO)=0 THEN 1130
1120 CALL VCHAR(AR(PO),AC(PO),96)
1130 AR(PO)=PR
1140 AC(PO)=PC
1150 CALL VCHAR(PR,PC,104+(PO*)
1160 CALL GCHAR(PR,PC-1,G)
1170 AD(PO)=ABS((G=97)+(G=99)+(G=128)+(G=146)+(G=147))
1180 GOTO 500
1200 PO=0
1210 PD=1
1220 GOTO 1250
1230 PO=1
1240 PD=0
1250 IF(AR(PD)=0)THEN 501
1260 CALL VCHAR(R,C,B)
1270 R=AR(PD)
1280 C=AC(PD)+DX(AD(PD))
1290 D=AD(PD)
1300 CALL GCHAR(R,C,B)
1310 GOTO 500
1500 CALL SOUND(500,-6,2)
1510 CALL VCHAR(R,C,B)
1520 FOR I=1 TO 1000
1530 NEXT I
1540 GOTO 270
2000 CALL GCHAR(CR,CC+DX(D),CG)
2001 IF CG=104 THEN 2300
2002 IF CG=112 THEN 2320
2010 IF(CG<>97)*(CG<>99)THEN 501
2020 CALL VCHAR(CR,CC,CB)
2030 CALL VCHAR(R,C,B)
2040 B=CB
2050 CB=CG
2060 CC=CC+DX(D)
2070 R=R+Y
2080 C=C+X
2090 CALL VCHAR(CR,CC,128)
2100 CALL VCHAR(R,C,D+144)
2110 CALL GCHAR(CR+1,CC,CG)
2120 IF CG=120 THEN 2200
2130 IF CG<>97 THEN 600
2140 CALL VCHAR(CR,CC,CB)
2150 CR=CR+1
2160 CB=CG
2170 CALL VCHAR(CR,CC,128)
2180 GOTO 2110
2200 CALL VCHAR(CR,CC,97)
2210 CR=CC=0
2220 GOTO 600
2300 PO=1
2310 GOTO 2330
2320 PO=0
2330 IF AR(PO)=0 THEN 501
2340 CALL VCHAR(CR,CC,CB)
2345 CALL VCHAR(R,C,B)
2346 B=CB
2347 R=CR
2348 C=CC
2350 CR=AR(PO)
2360 CC=AC(PO)+DX(AD(PO))*2
2370 CALL GCHAR(CR,CC,CB)
2380 GOTO 2090
5000 T=T+1
5010 IF T=4 THEN 5040
5030 RETURN
5040 T=0
5050 RETURN
8000 CALL CLEAR
8010 PRINT "TEST CHAMBER";L: : : : : : : : : : : : : : : : : : : : : : :
8020 CALL HCHAR(2,1,96,736)
8030 FOR I=1 TO 5
8040 CALL HCHAR(I+8,3,97,28)
8050 NEXT I
8060 FOR I=1 TO 5
8070 CALL VCHAR(14,19+I,97,6)
8080 NEXT I
8090 CALL VCHAR(14,25,99,6)
8091 CALL VCHAR(13,28,128)
8100 R=13
8110 C=3
8120 CR=13
8130 CC=28
8140 CB=97
8150 RETURN
10000 DATA 96,FFFFFFFFFFFFFFFF,97,0,98,FF88BBBBFF88BBBB,104,1038387C7C383810,112,1038387C7C383810
10010 DATA 99,FFFFAA,120,F9A7D50E6FE5AB70,128,00EE92926C9292EE,129,00C0A0881888A0C0,130,0003051130110503
10020 DATA 131,C0A080808080A0C0,132,0305010101010503,133,C0A0A0A0A0A0A0C0,134,03050505050503
10030 DATA 136,002854385428,152,FF18,153,FF999999999999FF,154,8181818181818181,99,7E007E007E007E
10040 DATA 144,0018123C50146C40,145,0018483C0A283602,146,0018133E5010282C,147,0018C87C0A081434
11000 DATA 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
11010 DATA 15,16,6,15,10,15,4,12,2,16,8,16,7,16,2,15

 

 

 

KEY COMMANDS:

E - Up

S - Left

D - Right

X - Down

O - Create orange portal on acceptable surface in facing direction

B - Create blue portal on acceptable surface in facing direction

 

Adamantyr

 

(Edited to correct bug described in below responses)

Edited by adamantyr
Link to comment
Share on other sites

That's pretty cool already! And the response is fast enough to not really distract from the game itself. I already want more levels, so hurry up!

 

Yeah, keeping things fast in BASIC is really tough... I'm trying to have it so you can shoot off a portal while falling, but it seems the key responses aren't quite fast enough to catch it... or maybe you just need to fall further.

 

There are a few events I need to track. My plan is to have them complete a whole cycle, rather than try and move with the player, because generally, BASIC sucks at doing more than one object at a time. So the "energy balls" will basically emit and travel their entire length before expiring. (No bounces)

 

Adamantyr

Link to comment
Share on other sites

Great game, Adam... I had a bit of an issue... the portals got placed inside the walls for a moment, and when I bounced between them, it eventually kicked out a "BAD VALUE IN LINE 700" error... Obviously I know this is a test chunk of code, but WOW... This works fantastic.

 

Error... I actually put a portal behind the block and pushed the block into the portal. The other side of the portal was at the bottom of the stairs... When the block went through, it materialized INSIDE the walls, and so did I. Then when I tried to get out of it, it kicked out an error

 

aperture.jpg

 

aper2.jpg

 

aper3.jpg

Link to comment
Share on other sites

Error... I actually put a portal behind the block and pushed the block into the portal. The other side of the portal was at the bottom of the stairs... When the block went through, it materialized INSIDE the walls, and so did I. Then when I tried to get out of it, it kicked out an error

 

Ah, small bug with the portal orientation... plus I had to make it so ladders and empty area were legitimate exit points, may still be some bias against non-empty in there.

 

Thanks for catching it!

 

Adamantyr

Link to comment
Share on other sites

Hey guys... so far Adam and Keith have shown a screenshot of their games... anyone else working on a game? Care to share a screenshot?

 

These contests get alot more exciting when everyone sees screenshots of the games you're developing. It is a motivating tool, you see. =)

 

Adam's game is pretty awesome, if you guys haven't had a chance to play with the teaser code yet... it's really interesting. =)

Link to comment
Share on other sites

Here's a video of the bug. hope this helps!

 

Yeah, got it now... you have to be right up against the wall for it to fail. And I know why... the player graphic and block graphic weren't considered viable empty spots for determining orientation. :) A single line fix and it's good:

 

1170 AD(PO)=ABS((G=97)+(G=99)+(G=128)+(G=146)+(G=147))

 

Adamantyr

Link to comment
Share on other sites

Glad you got it square. :) good to find these bugs and squash em.

 

BTW, I have started my own BASIC game to post as well... It's not as cool as this game--- in premise or execution, but I thought I'd give it a go--- since there have only been two screenshots posted so far. :) Expect a screenshot and a game description later today.... It's side tracking my assembly program, but hey.... Whatever. :)

Link to comment
Share on other sites

I have a game - I've already ack'ed Adam's as the winner... Mine should also work out... I will not be posting anything until completion... I've done some other early posts in contests, but this one I think I'll hold back...

 

One thing Adam did remind me of is that PRINT takes : : : : to print multiple lines. I forgot that, but I did that magic in a loop (and did other work in there).

 

I have the level layout planned and first level drawing... No game play yet....

 

-H

 

Hey guys... so far Adam and Keith have shown a screenshot of their games... anyone else working on a game? Care to share a screenshot?

 

These contests get alot more exciting when everyone sees screenshots of the games you're developing. It is a motivating tool, you see. =)

 

Adam's game is pretty awesome, if you guys haven't had a chance to play with the teaser code yet... it's really interesting. =)

Link to comment
Share on other sites

Adam--- any idea about how many of these levels will be possible in BASIC?? How much memory does each take? :)

 

I'm working on that now. I had never intended to use static HCHAR and VCHAR to build each one. Instead, I'm encoding the data to build each into strings stored in DATA statements.

 

For example:

20000 DATA "493a5L4>Da654>:a344A:x243>Hc61=L€0"
20010 DATA "=3a=La"

 

The first string stores screen build data. The first value is the type of action, the following is data. Breaking one down:

 

4 = Draw Block

9 = Row

3 = Column

a = Character to draw

5 = 5 Rows

L = 28 Columns (ASCII value of 'L' minus 48)

 

The second string is coordinates for the player and cube. I will probably have a third string to store dynamics like buttons, power emitters, etc.

 

The only tricky bit is printing characters above 127. The TI console does have some shortcuts; you can press CONTROL+SHIFT to add 64 to the targeted letter value and print it. So CONTROL+SHIFT+A prints 129 (65+64). The 128 character is an oddball, though. To get 128, you do CONTROL+SHIFT+, instead.

 

So, using this technique, I should be able to keep each level very tight. Level design is going to be a challenge; I'll want each successive chamber to be slightly more difficult. Each one is a puzzle, so I could spend quite a bit of time there.

 

Adamantyr

Link to comment
Share on other sites

Fascinating. You guys are good--- :)

 

Mine won't be as tight and efficient, but it will work just fine--- I might use all 14+-k, but I'm actually pleased with what I've been able to accomplish thus far. BASIC is so cool....

 

This is making me seriously question my 'please wait half an ice age' game start. Once I get the actual mechanics of it working, I'm gonna have to go back and brainstorm a better way.

Link to comment
Share on other sites

Another quick update...

 

I have two test chambers designed using my new "encoded" system. It took about 120 bytes to define the second one, so I feel pretty good about getting at least 15 chambers into the game... I will have to focus on making levels that compress more easily into this system. Also need to create a spreadsheet to generate them more easily...

 

I fixed the controls so you can do something new... I am noticing that the player is slowing down inch by inch as I add more functionality. :P That's the problem with TI BASIC, tracking more than a few things starts to really impact it. I think it's still playable in its current form, and most of the code to do stuff while you're moving is done.

 

 

 

100 DIM DX(2),AR(2),AC(2),AD(2)
110 DX(0)=1
120 DX(1)=-1
130 CALL CLEAR
140 FOR I=1 TO 22
150 READ C,C$
160 CALL CHAR(C,C$)
170 NEXT I
180 FOR I=1 TO 16
190 READ F,B
200 CALL COLOR(I,F,B)
210 NEXT I
220 PRINT TAB(10);"APERTURE": : : : : : : : : : : : : :
230 PRINT "   PRESS ANY KEY TO START"
240 CALL KEY(0,K,S)
250 IF S=0 THEN 240
260 L=2
270 GOSUB 8000
290 X=Y=D=AR(0)=AR(1)=AC(0)=AC(1)=T=0
500 CALL VCHAR(R,C,D+144)
501 GOSUB 5000
510 IF B=99 THEN 580
520 CALL GCHAR(R+1,C,G)
530 IF(G=120)+((G>=136)*(G<=138))THEN 1500
540 IF G<>97 THEN 580
550 Y=1
560 X=0
570 GOTO 600
580 Y=0
600 CALL KEY(3,K,S)
605 IF S=0 THEN 670
610 IF(K=83)*(Y=0)THEN 800
620 IF(K=68)*(Y=0)THEN 830
630 IF(K=69)*(Y=0)THEN 860
640 IF(K=88)*(Y=0)THEN 900
650 IF K=66 THEN 1000
660 IF K=79 THEN 1020
670 IF Y=0 THEN 510 ELSE 720
700 CALL GCHAR(R+Y,C+X,G)
701 IF G=104 THEN 1200
702 IF G=112 THEN 1230
703 IF(G=120)+((G>=136)*(G<=138))THEN 1500
704 IF G=128 THEN 2000
705 IF G=153 THEN 3000
710 IF(G<>97)*(G<>99)THEN 510
720 CALL VCHAR(R,C,B)
730 R=R+Y
740 C=C+X
750 B=G
760 GOTO 500
800 X=-1
810 D=1
820 GOTO 700
830 X=1
840 D=0
850 GOTO 700
860 IF B<>99 THEN 510
870 Y=-1
880 X=0
890 GOTO 700
900 CALL GCHAR(R+1,C,G)
910 IF G<>99 THEN 600
920 Y=1
930 X=0
940 GOTO 720
1000 PO=0
1010 GOTO 1030
1020 PO=1
1030 CALL VCHAR(R,C,D+146)
1035 PX=DX(D)
1040 PR=R
1050 PC=C+PX
1060 CALL GCHAR(PR,PC,G)
1070 IF G=96 THEN 1110
1080 IF(G<>97)*(G<>99)*(G<>128)THEN 500
1090 PC=PC+PX
1100 GOTO 1060
1110 IF AR(PO)=0 THEN 1130
1120 CALL VCHAR(AR(PO),AC(PO),96)
1130 AR(PO)=PR
1140 AC(PO)=PC
1150 CALL VCHAR(PR,PC,104+(PO*)
1160 CALL GCHAR(PR,PC-1,G)
1170 AD(PO)=ABS((G=97)+(G=99)+(G=128)+(G=146)+(G=147))
1180 GOTO 500
1200 PO=0
1210 PD=1
1220 GOTO 1250
1230 PO=1
1240 PD=0
1250 IF(AR(PD)=0)THEN 501
1260 CALL VCHAR(R,C,B)
1270 R=AR(PD)
1280 C=AC(PD)+DX(AD(PD))
1290 D=AD(PD)
1300 CALL GCHAR(R,C,B)
1310 GOTO 500
1500 CALL SOUND(500,-6,2)
1510 CALL VCHAR(R,C,B)
1520 FOR I=1 TO 1000
1530 NEXT I
1540 GOTO 270
2000 CALL GCHAR(CR,CC+DX(D),CG)
2001 IF CG=104 THEN 2300
2002 IF CG=112 THEN 2320
2010 IF(CG<>97)*(CG<>99)THEN 501
2020 CALL VCHAR(CR,CC,CB)
2030 CALL VCHAR(R,C,B)
2040 B=CB
2050 CB=CG
2060 CC=CC+DX(D)
2070 R=R+Y
2080 C=C+X
2090 CALL VCHAR(CR,CC,128)
2100 CALL VCHAR(R,C,D+144)
2110 CALL GCHAR(CR+1,CC,CG)
2120 IF CG=120 THEN 2200
2130 IF CG<>97 THEN 600
2140 CALL VCHAR(CR,CC,CB)
2150 CR=CR+1
2160 CB=CG
2170 CALL VCHAR(CR,CC,128)
2180 GOTO 2110
2200 CALL VCHAR(CR,CC,97)
2210 CR=CC=0
2220 GOTO 600
2300 PO=1
2310 GOTO 2330
2320 PO=0
2330 IF AR(PO)=0 THEN 501
2340 CALL VCHAR(CR,CC,CB)
2345 CALL VCHAR(R,C,B)
2346 B=CB
2347 R=CR
2348 C=CC
2350 CR=AR(PO)
2360 CC=AC(PO)+DX(AD(PO))*2
2370 CALL GCHAR(CR,CC,CB)
2380 GOTO 2090
3000 L=L+1
3010 GOTO 270
5000 T=T+1
5010 IF T=4 THEN 5040
5030 RETURN
5040 T=0
5050 RETURN
8000 CALL CLEAR
8010 PRINT "TEST CHAMBER";L: : : : : : : : : : : : : : : : : : : : : : :
8020 CALL HCHAR(2,1,98,736)
8030 FOR I=1 TO 21
8040 CALL HCHAR(2+I,2,96,30)
8050 NEXT I
8060 ON L GOTO 8100,8120,8140,8160,8180,8200,8220,8240,8260,8280
8100 RESTORE 20000
8110 GOTO 8500
8120 RESTORE 20100
8130 GOTO 8500
8140 RESTORE 20200
8150 GOTO 8500
8160 RESTORE 20300
8170 GOTO 8500
8180 RESTORE 20400
8190 GOTO 8500
8200 RESTORE 20500
8210 GOTO 8500
8220 RESTORE 20600
8230 GOTO 8500
8240 RESTORE 20700
8250 GOTO 8500
8260 RESTORE 20800
8270 GOTO 8500
8280 RESTORE 20900
8290 GOTO 8500
8500 READ T$
8510 I=1
8520 T=ASC(SEG$(T$,I,1))-48
8530 IF T=0 THEN 9000
8535 IF T=5 THEN 8500
8540 I=I+1
8550 R=ASC(SEG$(T$,I,1))-48
8560 I=I+1
8570 C=ASC(SEG$(T$,I,1))-48
8580 I=I+1
8590 B=ASC(SEG$(T$,I,1))
8600 I=I+1
8610 ON T GOTO 8620,8640,8680,8720
8620 CALL VCHAR(R,C,B)
8630 GOTO 8520
8640 H=ASC(SEG$(T$,I,1))-48
8650 I=I+1
8660 CALL HCHAR(R,C,B,H)
8670 GOTO 8520
8680 H=ASC(SEG$(T$,I,1))-48
8690 I=I+1
8700 CALL VCHAR(R,C,B,H)
8710 GOTO 8520
8720 V=ASC(SEG$(T$,I,1))-48
8730 I=I+1
8740 H=ASC(SEG$(T$,I,1))-48
8750 I=I+1
8760 FOR J=1 TO V
8770 CALL HCHAR((R-1)+J,C,B,H)
8780 NEXT J
8790 GOTO 8520
9000 READ T$
9010 R=ASC(SEG$(T$,1,1))-48
9020 C=ASC(SEG$(T$,2,1))-48
9030 B=ASC(SEG$(T$,3,1))
9040 CR=ASC(SEG$(T$,4,1))-48
9050 CC=ASC(SEG$(T$,5,1))-48
9060 CB=ASC(SEG$(T$,6,1))
9100 RETURN
10000 DATA 96,FFFFFFFFFFFFFFFF,97,0,98,FF88BBBBFF88BBBB,104,1038387C7C383810,112,1038387C7C383810
10010 DATA 120,F9A7D50E6FE5AB70,128,00EE92926C9292EE,129,00C0A0881888A0C0,130,0003051130110503
10020 DATA 131,C0A080808080A0C0,132,0305010101010503,133,C0A0A0A0A0A0A0C0,134,03050505050503
10030 DATA 136,002854385428,152,FF5A,153,FF999999999999FF,99,7E007E007E007E,100,FFFF423C
10040 DATA 144,0018123C50146C40,145,0018483C0A283602,146,0018133E5010282C,147,0018C87C0A081434
11000 DATA 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
11010 DATA 15,16,6,15,10,15,4,12,2,16,8,16,7,16,2,15
20000 DATA "4=2b;;4=3a5L4B>a6544La323B=c634Kc>16N™0"
20010 DATA "A4a000"
20100 DATA "446a4C486a<94D3a4544Ka4348Ba<74BFa654:Ia624>:`34373c93>>c63D8c43DEc438Mc834Ab4263a32?4a22:?a32?Ka25"
20101 DATA "2@6`22;=`217J™0"
20110 DATA "G5a000"
20200 DATA "0"
20210 DATA "000000"
20300 DATA "0"
20310 DATA "000000"
20400 DATA "0"
20410 DATA "000000"
20500 DATA "0"
20510 DATA "000000"
20600 DATA "0"
20610 DATA "000000"
20700 DATA "0"
20710 DATA "000000"
20800 DATA "0"
20810 DATA "000000"
20900 DATA "0"
20910 DATA "000000"

 

 

 

The game WILL crash on level 3, because of a lack of data.

 

Adamantyr

Link to comment
Share on other sites

Got bad value in 160 running that :(

 

Oh - running in XB - char 152 prolly not available... Retrying :)

 

BTW - I LOVES overdrive when pasting...

 

Err - now bad value in 8520

T$ = "2@6`22;=`217J0"

I=15 (this is the problem since string is only 14 chars long

Edited by unhuman
Link to comment
Share on other sites

what's the small TM after the N?

 

Ah HA... yeah, everyone's got the same problem. The paste function on Classic99 isn't translating the ASCII character right. You'll have to enter it in by hand.

 

These lines:

20000 DATA "4=2b;;4=3a5L4B>a6544La323B=c634Kc>16N™0"
20101 DATA "2@6`22;=`217J™0"

 

Go to the TM character in TI BASIC and press CONTROL+SHIFT+Y

 

That will insert character 153.

 

Adamantyr

Edited by adamantyr
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...