Jump to content
Savetz

Wizard's Revenge re-typed by the author

Recommended Posts

So, this is interesting.

 

I interviewed Max Manowski, author of the text adventure game Wizard's Revenge, published by APX. (I haven't published that interview yet.)

 

In it, he expressed annoyance that there were a lot of bad/buggy versions of the game floating around - he says he sent it out bug free, but people messed it up and distributed bad versions. Indeed, the version I tried from AtariMania didn't work too well. For instance, simply typing INVENTORY crashes it.

 

 

 

He had on his desk his original printout of the game. In the days following the interview, he laboriously re-typed it so that we can all have a working, bug-free version.

 

I'm attaching that effort here, in the hopes that the Hive Mind will paste this puppy into an emulator and create a nice freshie version, and so his work doesn't go to waste.

 

-Kevin

 

 

wizards revenge.txt

  • Like 11

Share this post


Link to post
Share on other sites

How does one convert from TXT to Atari BASIC .BAS file anyway?

Any conversion tools?

 

I know the emulators will let you "print" out a listing via the ATARI basic list command, but how about the other way around?

Share this post


Link to post
Share on other sites

How does one convert from TXT to Atari BASIC .BAS file anyway?

Any conversion tools?

 

I know the emulators will let you "print" out a listing via the ATARI basic list command, but how about the other way around?

 

When in BASIC type ENTER"D:REVENGE.TXT" (or whatever you renamed it to to fit the 8 character limit). Then just do a SAVE back to disk with the .BAS extension.

 

- Michael

 

EDIT: be sure to first strip out all the text before the actual line numbered area using a text editor. Also will need to change the end of line character, which is probably easiest by using the PC program MemoPad.

Edited by mytekcontrols
  • Like 1

Share this post


Link to post
Share on other sites

Having a look at the code now.

 

Line 20, 5670 has the clear screen, and line 21 is missing a colon between PRINTs - causing an error.

2560 has a GOSUP

5870 is missing quotes

7817 the SOUND command is missing a field?

 

I guess there's still a few bugs.

 

Will just have to figure out how to create the files needed for the game

Edited by Neo-Rio

Share this post


Link to post
Share on other sites

Copy text, right click on Altirra emulator, paste.

Share this post


Link to post
Share on other sites

Copy text, right click on Altirra emulator, paste.

It's not a single BASIC file. There are data files on the disk that need to be generated.

  • Like 2

Share this post


Link to post
Share on other sites
10 REM WIZARD'S REVENGE
20 PRINT "}"
21 PRINT  PRINT "          WIZARD'S-REVENGE"
22 PRINT "          COPYRIGHT 1981"
23 PRINT "          BY MAX MANOWSKI"
24 PRINT
30 DIM INVENTORY$(20)
31 DIM NODE$(
32 DIM FILE$(10)
33 DIM PRINT$(50)
34 DIM INPUT$(50)
35 DIM TEMP$(52)
36 DIM CONDITION$(64)
50 HELP=0
51 LIGHT=0
52 CONMAX=6
53 CON=6
100 FOR N=1 TO 64
110 CONDITION$(N,N)="N"
120 NEXT N
200 NODE$="INIT"
300 FOR N=1 TO 20
310 INVENTORY$(N,N)="N"
320 NEXT N
340 EOF=0
390 REM
900 PRINT "    YOU HAVE AMADE A POWERFUL"
901 PRINT "    WIZARD VERY ANGRY. HE HAS"
902 PRINT "    PUT YOU INTO A STRANGE LAND"
903 PRINT "    WITH NOTHING BUT THE CLOTHES"
904 PRINT "    THAT YOU ARE WEARING."
910 PRINT
911 PRINT "YOUR OBJECT IS TO GET OUT OF THIS"
912 PRINT "STRANGE LAND."
915 PRINT "YOU MAY TRY ANYTHING YOU WANT"
920 PRINT "TO GET OUT OF THIS MESS. IF"
925 PRINT "YOU CAN'T THINK OF ANYTHING ELSE"
930 PRINT "TO TRY, THEN JUST TYPE THE WORD HELP."
935 PRINT "BE WARNED, USING ‘HELP' CAN"
940 PRINT "BE DANGEROUS!!!"
950 PRINT "OTHER USEFUL WORDS ARE INVENTORY"
960 PRINT "AND LOOK. PRESS RETURN TO START"
970 INPUT INPUT$
1000 REM PRINT DESCRIPTION FIRST /////
1010 GOSUB 3000
2000 REM GET ACTIONS /////
2005 CLOSE #1
2007 PRINT "WHAT ARE YOU GOING TO DO"
2010 INPUT INPUT$
2015 PRINT
2020 IF LEN(INPUT$)>36 THEN PRINT "SAY IT WITH FEWER WORDS":GOTO 2007
2030 IF LEN(INPUT$)<2 THEN 2010
2043 TEMP$=" "
2046 TEMP$(2)=INPUT$
2050 TEMP$(LEN(TEMP$)+1)=" "
2060 LET INPUT$=TEMP$:IF LEN(INPUT$)<5 THEN 2064
2061 PRINT "   ":FOR N=1 TO LEN(INPUT$)-4
2062 IF INPUT$(N,N+4)=" THE " THEN LET INPUT$(N,N+4)="     "
2063 NEXT N
2064 FOR N=1 TO LEN(INPUT$)-2:IF INPUT$(N,N+2)=" A " THEN LET INPUT$(N,N+2)="   "
2065 NEXT N
2066 FOR N=1 TO LEN(INPUT$)
2067 TEMP$=INPUT$(N,N)
2070 IF TEMP$="," OR TEMP$="!" THEN LET INPUT$(N,N)=" "
2080 IF TEMP$<>"?" THEN 2120
2090 PRINT "I DON'T ANSWER QUESTIONS"
2100 POP
2110 GOTO 2010
2120 NEXT N
2130 N=1
2135 IF N=LEN(INPUT$) THEN 2160
2140 IF INPUT$(N,N+1)="  " THEN LET INPUT$(N)=INPUT$(N+1):GOTO 2135
2150 N=N+1:GOTO 2135
2160 PRINT INPUT$
2165 PRINT
2166 IF LEN(INPUT$)<7 THEN 2210
2170 IF INPUT$(1,6)=" WHAT " OR INPUT$(1,7)=" WHERE " OR INPUT$(1,5)=" HOW " OR INPUT$(1,5) =" WHY " THEN 2090
2180 FOR N=1 TO LEN(INPUT$)-4:IF INPUT$(N,N+4)=" AND " THEN2200
2190 NEXT N:GOTO 2210
2200 PRINT "YOU ARE TRYING TO DO TOO MUCH WITH":PRINT "ONE INSTRUCTION.":GOTO 2010
2210 REM
2500 REM TAKE ACTION /////
2510 TRAP 4200
2520 FILE$="D:"
2530 FILE$(3)=NODE$
2540 OPEN #1,4,0,FILE$
2550 TRAP 0
2560 GOSUP 4400
2570 IF FOUND THEN 2640
2580 CLOSE #1
2670 TRAP 0
2680 GOTO 2000
3000 REM PRINT DESCRIPTION /////
3005 IF NODE$="END" THEN 9200
3007 CLOSE #1
3010 TRAP 3090
3020 FILE$="D:"
3030 FILE$(E)=NODE$
3040 OPEN #1,4,0,FILE$
3050 GOSUB 4815
3060 RETURN
3090 TRAP 40000
3100 CLOSE #1
3110 RETURN
4400 REM FIND A MATCH /////
4410 FOUND=0
4420 GOSUB 5400
4430 IF EOF THEN CLOSE #1:GOTO 4590
4440 INPUT #1,TEMP$
4445 IF TEMP$="**" THEN CLOSE #1:RETURN
4450 IF TEMP$="*" THEN 4420
4455 IF TEMP$="/ANY/" THEN 4580
4460 LET PRINT$=" ":LET PRINT$(2)=TEMP$
4465 TEMP$=PRINT$:TEMP$(LEN(TEMP$)+1)=" "
4470 IF LEN(TEMP$)>LEN(INPUT$) THEN 4440
4480 FOR N=1 TO LEN(INPUT$)-LEN(TEMP$)+1
4490 IF INPUT$(N,N+LEN(TEMP$)-1)=TEMP$ THEN GOTO 4580
4500 NEXT N
4510 GOTO 4440
4580 FOUND=1
4581 PRINT " ";
4582 FOR NN=N+2 TO N+LEN(TEMP$)-1
4583 POKE 85,NN:PRINT "  ";:NEXT NN
4584 PRINT
4590 TRAP 0:RETURN
4600 REM RANDOM RESPONSE /////
4610 GOTO INT(RND(0)*5)*10+4620
4620 PRINT "HUH?":RETURN
4630 PRINT "WHAT?":RETURN
4640 PRINT "I DON'T UNDERSTAND":RETURN
4650 PRINT "YOU CAN'T DO THAT":RETURN
4660 GOSUB 4600
4670 PRINT "WOULD YOU PUT THAT ANOTHER WAY"
4680 RETURN
4800 REM DO ACTIONS /////
4810 GOSUB 5400
4815 IF EOF THEN EOF=0:CLOSE #1:RETURN
4820 INPUT #1,INPUT$
4825 IF INPUT$="**" THEN EOF=1:GOTO 4815
4830 IF INPUT$="*" THEN RETURN
4840 TEMP$=INPUT$(1,1)
4845 IF LEN(INPUT$)=1 THEN LET INPUT$="":GOTO 4860
4850 LET INPUT$=INPUT$(2)
4855 TRAP 40000
4860 IF TEMP$="P" THEN PRINT INPUT$:GOTO 4820
4861 IF TEMP$="A" THEN LIGHT=1:LET INPUT$=""
4862 IF TEMP$="B" THEN LIGHT=0:LET INPUT$=""
4863 IF TEMP$="E" THEN CON=CONMAX:LET INPUT$=""
4864 IF TEMP$="J" THEN GOSUB 7400:CONDITION=INVENTORY$(N,N)="Y":LET INPUT$=""
4870 IF TEMP$="G" THEN NODE$=INPUT$:CLOSE #1:GOTO 3000
4871 IF TEMP$="X" THEN 9600
4872 IF TEMP$="H" THEN 9800
4873 IF TEMP$="U" THEN IF LIGHT=0 THEN 4840
4874 IF TEMP$="V" THEN IF LIGHT=1 THEN 4840
4880 IF TEMP$="Q" THEN GOTO 5600
4890 IF TEMP$="D" THEN GOTO 5800
4900 IF TEMP$="I" THEN GOSUB 6000
4910 IF TEMP$="M" THEN GOSUB 6200:GOTO 2000
4920 IF TEMP$="T" THEN GOSUB 6400
4930 IF TEMP$="W" THEN FOR N=1 TO VAL(INPUT$):NEXT N:GOTO 4820
4940 IF TEMP$="R" THEN GOSUB 7200
4941 IF TEMP$="C" THEN 9300
4942 IF TEMP$="0" THEN 9400
4943 IF TEMP$="1" THEN 9500
4950 IF TEMP$="Y" THEN IF CONDITION THEN 4840
4960 IF TEMP$="N" THEN IF  NOT CONDITION THEN 4840
4970 IF TEMP$="L" THEN GOSUB 7400:TEMP$="":IF FOUND THEN INVENTORY$(N,N)="N"
4971 IF TEMP$="K" THEN GOSUB 7400:TEMP$="":IF FOUND THEN INVENTORY$(N,N)="Y"
4980 IF TEMP$="S" THEN GOSUB 7800
4981 IF TEMP$="F" THEN 9900
4990 GOTO 4820
5000 STOP
5400 REM SKIP A BLOCK /////
5402 STOP
5405 TRAP 5440
5410 INPUT #1,TEMP$
5420 IF TEMP$="*" THEN RETURN
5430 GOTO 5410
5440 TRAP 0
5450 EOF=1
5460 CLOSE #1
5470 CLOSE #2
5480 RETURN
5600 REM QUIT /////
5610 CLOSE #1
5620 CLOSE #2
5630 TRAP 0
5640 PRINT "DO YOU WANT TO PLAY AGAIN";
5650 INPUT INPUT$
5655 IF LEN(INPUT$)=0 THEN 5640
5660 IF INPUT$(1,1)="Y" THEN GRAPHICS 0:RUN
5670 PRINT ")":END
5800 REM DIE /////
5810 GRAPHICS 2
5820 POSITION 9,4
5830 PRINT #6;"you"
5840 POSITION 9,6
5850 PRINT #6;"are"
5860 POSITION 7,8
5870 PRINT #6;"d e a d"
5880 FOR N=1 TO 500:NEXT N
5890 GOTO 5600
6000 REM PRINT INVENTORY /////
6010 FLAG=0
6015 N=0
6020 TRAP 6090
6030 RESTORE
6040 PRINT "YOU HAVE:"
6050 READ TEMP$
6060 N=N+1
6070 IF INVENTORY$(N,N)="Y" THEN FLAG=1:PRINT TEMP$
6080 GOTO 6050
6090 IF LIGHT THEN PRINT "TORCH:FLAG=1
6095 IF  NOT FLAG THEN PRINT "NOTHING"
6100 TRAP 0
6105 TEMP$=""
6110 RETURN
6200 REM FIGHT MONSTER /////
6205 TRAP 0
6210 N=VAL(INPUT$)
6213 TEMP$=""
6215 IF N<(100*RND(0)) THEN RETURN
6217 MONSIZE=INT(RND(0)*3)
6219 PRINT "THERE IS A ";
6220 IF MONSIZE=0 THEN PRINT "LITTLE ";
6221 IF MONSIZE=1 THEN PRINT "BIG ";
6222 IF MONSIZE=2 THEN PRINT "HUGE ";
6223 PRINT "MONSTER HERE!"
6224 PRINT "YOU CAN SEE THAT YOU MUST KILL IT"
6225 PRINT "OR IT WILL KILL YOU"
6227 HTK=CON:MHTK=3+3*MONSIZE
6230 PRINT "  WHAT ARE YOU GOING TO DO?"
6233 HIT=0:DAM=0
6235 INPUT INPUT$
6236 PRINT
6240 TEMP$=" ":TEMP$(2)=INPUT$
6245 TEMP$(LEN(TEMP$)+1)=" "
6250 LET INPUT$=TEMP$
6255 CLOSE #1
6260 OPEN #1,4,0,"D:MONSTER"
6265 GOSUB 4400
6270 IF  NOT FOUND THEN PRINT "THAT HAS NO EFFECT ON IT.":GOTO 6325
6275 GOSUB 5400
6280 IF EOF THEN 6325
6285 INPUT #1,INPUT$
6290 IF INPUT$="*" THEN 6325
6300 TEMP$=INPUT$(1,1)
6302 IF LEN(INPUT$)<2 THEN LET INPUT$="":GOTO 6310
6305 LET INPUT$=INPUT$(2)
6310 IF TEMP$="W" THEN GOSUB 7200:IF  NOT FOUND THEN GOTO 6325
6311 IF TEMP$="P" THEN PRINT INPUT$
6312 IF TEMP$="L" THEN GOSUB 7400:TEMP$="":IF FOUND THEN INVENTORY$(N,N)="N"
6313 IF TEMP$="X" THEN LET INPUT$="75":GOTO 6400
6314 IF TEMP$="M" THEN N=VAL(INPUT$):MONSIZE=N:MHTK=3+3*MONSIZE:GOTO 6285
6315 IF TEMP$="H" THEN HIT=HIT+VAL(INPUT$)
6316 IF TEMP$="0" THEN IF MONSIZE=0 THEN 6300
6317 IF TEMP$="1" THEN IF MONSIZE=1 THEN 6300
6318 IF TEMP$="2" THEN IF MONSIZE=2 THEN 6300
6319 IF TEMP$="T" THEN IF LIGHT=1 THEN GOTO 6300
6320 IF TEMP$="T" THEN PRINT "BUT YOU DON'T HAVE A TORCH"
6321 IF TEMP$="D" THEN DAM=DAM+VAL(INPUT$)
6322 GOTO 6285
6325 REM TAKE BATTLE ACTIONS /////
6330 TRAP 0
6335 CLOSE #1
6340 IF (100*RND(0))<HIT THEN PRINT "YOU WOUND THE MONSTER":MHTK=MHTK-DAM
6345 IF MHTK<1 THEN PRINT "AND YOU HAVE KILLED HIM!":LET INPUT$="75":GOTO 6400
6350 IF RND(0)<(0.5+0.1*MONSIZE) THEN PRINT "THE MONSTER BITES YOU":HTK=HTK- 5*RND(0)-MONSIZE
6355 IF HTK<0 THEN FOR W=1 TO 200:NEXT W:GOTO 5800
6380 GOTO 6230
6400 REM FOUND TREASURE /////
6410 N=VAL(INPUT$)
6415 TEMP$=""
6420 IF N<(100*RND(0)) THEN RETURN
6440 GOSUB 7000
6450 N=INT(N*RND(0))+1
6460 IF INVENTORY$(N,N)="Y" THEN RETURN
6470 RESTORE
6480 FOR NN=1 TO N
6490 READ TEMP$
6500 NEXT NN
6510 PRINT "YOU FIND AND KEEP A ";
6520 INVENTORY$(N,N)="Y"
6530 PRINT TEMP$
6540 TEMP$="":RETURN
6600 REM DATA FOR INVENTORY /////
6610 DATA SWORD
6615 DATA KEY
6620 DATA ROPE
6625 DATA POTION
6630 DATA WORM
6635 DATA FLUTE
6640 DATA RED GEM
6645 DATA GOLD COIN
6650 DATA SILVER BUTTON
6655 DATA RAG
6660 DATA PEARL
6665 DATA BOOK
6670 DATA SMALL RUBBER BALL
7000 REM NUMBER IN INVENTORY (=N) /////
7010 TRAP 7070
7020 N=0
7030 RESTORE
7040 READ TEMP$
7050 N=N+1
7060 GOTO 7040
7070 TRAP 0
7080 RETURN
7200 REM REQUIRE ITEM /////
7210 TEMP$=""
7220 CONDITION=0
7230 GOSUB 7400
7240 IF  NOT FOUND THEN RETURN
7245 IF INVENTORY$(N,N)="N" THEN PRINT "BUT YOU DON'T HAVE A ";INPUT$:FOUND=0:GOTO 7260
7250 CONDITION=1
7260 TEMP$=""
7270 RETURN
7400 REM FIND ITEM AND ITEM NUMBER /////
7410 N=0
7420 FOUND=0
7430 TRAP 7490
7440 RESTORE
7450 READ TEMP$
7460 N=N+1
7470 IF TEMP$=INPUT$ THEN FOUND=1:GOTO 7490
7480 GOTO 7450
7490 TRAP 0:RETURN
7800 REM MAKE SOUND /////
7805 LET SOUND=VAL(INPUT$)
7810 IF SOUND<>1 THEN 7820
7813 REM EXPLOSION /////
7814 FOR N=200 TO 0 STEP -10
7815 SOUND 0,100,0,N/13.333
7816 SOUND 1,30,4,N/13.333
7817 SOUND 2,230-N/13.333
7818 FOR NN=202 TO N STEP -10
7819 NEXT NN:NEXT N
7820 IF SOUND<>2 THEN 7830:REM FALL ///
7821 FOR N=0 TO 200
7822 SOUND 0,N,10,15
7823 NEXT N
7824 SOUND 0,0,0,0
7830 REM CHIRP UP /////
7831 IF SOUND<>3 THEN GOTO 7840
7832 FOR N=30 TO 15 STEP -1
7833 SOUND 0,N,10,15
7834 NEXT N
7835 SOUND 0,0,0,0
7840 REM CHIRP DOWN /////
7841 IF SOUND<>4 THEN 7850
7842 FOR N=15 TO 45
7843 SOUND 0,N,14,8
7844 NEXT
7845 FOR N=1 TO 30:NEXT N
7846 SOUND 0,0,0,0
7850 REM POPPING /////
7851 IF SOUND<>5 THEN 7990
7554 FOR N=1 TO 30
7855 SOUND 0,100,0,8
7856 SOUND 1,30,4,8
7857 SOUND 2,200,8,8
7859 SOUND 0,0,0,0
7860 SOUND 1,0,0,0
7861 SOUND 2,0,0,0
7862 FOR NN=1 TO 1+RND(0)*5:NEXT NN
7863 NEXT N
7990 TEMP$="":RETURN
9300 REM CHECK CONDITION$ /////
9310 N=VAL(INPUT$)
9320 IF CONDITION$(N,N)="Y" THEN CONDITION=1:GOTO 4820
9330 CONDITION=0:GOTO 4820
9400 REM CLEAR CONDITION$ /////
9410 N=VAL(INPUT$)
9420 CONDITION$(N,N)="N"
9430 GOTO 4820
9500 REM SET CONDITION$ /////
9510 N=VAL(INPUT$)
9520 CONDITION$(N,N)="Y"
9530 GOTO 4820
9600 REM WORK LOOK /////
9610 GOSUB 3000
9615 POP
9620 GOTO 2000
9800 REM WORK ADD TO CONMAX /////
9810 N=VAL(INPUT$)
9820 CONMAX=CONMAX+N
9830 IF CONMAX>12 THEN CONMAX=12
9840 IF CONMAX<0 THEN FOR N=1 TO 200:NEXT N:GOTO 5800
9850 IF CON>CONMAX THEN CON=CONMAX
9860 GOTO 4820
9900 REM WORK HELP /////
9901 CLOSE #1
9902 HELP=HELP+1
9904 IF HELP<4 THEN 9910
9906 IF RND(0)*10<HELP THEN LET INPUT$="50":GOSUB 6200
9910 N=0
9915 PRINT "YOU MIGHT TRY ONE OF THESE:"
9920 FILE$="D:"
9925 FILE$(3)=NODE$
9930 OPEN #1,4,0,FILE$
9940 GOSUB 5400
9950 IF EOF THEN 10000
9955 INPUT #1,INPUT$
9960 IF INPUT$="*" THEN 9940
9970 IF INPUT$="**" THEN 10000
9972 IF INPUT$="/ANY/" THEN 9955
9975 IF RND(0)<0.25 THEN PRINT INPUT$:N=N+1:IF N=3 THEN CLOSE #1:GOTO 2010
9980 GOTO 9955
10000 IF FILE$="D:DEFAULT" THEN 10100
10005 CLOSE #1
10010 FILE$="D:DEFAULT"
10020 GOTO 9930
10100 CLOSE #1
10110 IF N<2 THEN GOTO 9920

The NODE files all 50 of them I leave to some else's labors.

 

 

  • Like 4

Share this post


Link to post
Share on other sites

 

Amade a powerful wizard angry?

 

Any more bugs? :?

I'm guessing

21 PRINT PRINT " WIZARD'S-REVENGE"
is missing a semicolon, comma, or colon between the two PRINT commands.

Share this post


Link to post
Share on other sites

One of the lines has a (E) instead of (3), and what are all the TRAP 0 statements about. Could it be similar to the TRAP 40000 statement.

3030 FILE$(E)=NODE$

I have cleaned it up a bit but no where like it is usable yet.. And I did some work on the NODEXX files.

 

Wizards.lst.TXT Atari Listing with proper RETURN key ATASCII line endings. Just cut the TXT off the filename. And enter into Emulator.

Edited by rdea6

Share this post


Link to post
Share on other sites

If you use the disk from AtariMania and break into the Altirra debugger, rebuild the variable table, save the result and then use the above listing to rename most of the variables, you end up with this, which is close to the above, but seems to be a slightly later version 1.1. Some likely typos based on comparing the two.

 

303​0 FILE$(3)=NODE$

6090 missing a "

7817 SOUND 2,230-N,8,N/13.333

7844 NEXT N

7554 is line 7854

9840 IF CONMAX<=0...

 

The TRAPs are all different.

 

WIZRUN.BAS

  • Like 1

Share this post


Link to post
Share on other sites

I just now found in my Misc atr collections an APX20054.DCM file and have used diskcom3 to convert it into an atr.

 

APX20054.ATR

 

This seems to work, but not a lot of testing done.

 

And much faster and easier than decoding the errors in the listing as posted by the OP.

Edited by rdea6

Share this post


Link to post
Share on other sites

Yes, seems to behave the same. Type "INVENTORY" and it locks up.

 

Was there more than one version released by APX? Perhaps a v1.1 or such? BTW, I mounted this in the Image Space in my MyIDE-II, and it executes really fast. Of course, there are several ways to achieve this response improvement.

 

-Larry

Share this post


Link to post
Share on other sites

After running FILELIST, recopied some NODE files.

Thanks, Fuji-Man for doing this.

 

Allan

Share this post


Link to post
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.

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...