mirror of
https://github.com/Torrididdle/Arcle.git
synced 2026-05-26 15:53:48 +01:00
First working version
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
Set Arcle$Dir <Obey$Dir>
|
||||||
|
IconSprites <Arcle$Dir>.!Sprites
|
||||||
|
WimpSlot -min 256k -max 256k
|
||||||
|
Dir <Arcle$Dir>
|
||||||
|
Run <Arcle$Dir>.!RunImage
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,39 @@
|
|||||||
|
# Project: Arcle
|
||||||
|
|
||||||
|
|
||||||
|
# Toolflags:
|
||||||
|
CCflags = -c -depend !Depend -IC: -throwback -w
|
||||||
|
C++flags = -c -depend !Depend -IC: -throwback
|
||||||
|
Linkflags = -aif -o $@
|
||||||
|
ObjAsmflags = -throwback -NoCache -depend !Depend
|
||||||
|
CMHGflags =
|
||||||
|
LibFileflags = -c -o $@
|
||||||
|
Squeezeflags = -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Final targets:
|
||||||
|
@.!RunImage: @.o.Arcle C:o.stubs
|
||||||
|
Link $(Linkflags) @.o.Arcle C:o.stubs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# User-editable dependencies:
|
||||||
|
|
||||||
|
|
||||||
|
# Static dependencies:
|
||||||
|
@.o.Arcle: @.c.Arcle
|
||||||
|
cc $(ccflags) -o @.o.Arcle @.c.Arcle
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Dynamic dependencies:
|
||||||
|
|
||||||
|
|
||||||
|
o.Arcle: c.Arcle
|
||||||
|
o.Arcle: C:h.swis
|
||||||
|
o.Arcle: C:h.kernel
|
||||||
|
o.Arcle: C:h.kernel
|
||||||
|
o.Arcle: c.Arcle
|
||||||
|
o.Arcle: C:h.swis
|
||||||
|
o.Arcle: C:h.kernel
|
||||||
|
o.Arcle: C:h.kernel
|
||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
+416
@@ -0,0 +1,416 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "swis.h"
|
||||||
|
#include <kernel.h>
|
||||||
|
|
||||||
|
// SWI Registers
|
||||||
|
_kernel_swi_regs inreg;
|
||||||
|
_kernel_swi_regs outreg;
|
||||||
|
|
||||||
|
// Hard coded - must match file sizes (or be greater).
|
||||||
|
char answers[11545];
|
||||||
|
char dict[64735];
|
||||||
|
|
||||||
|
// Should be enough (famous last words)
|
||||||
|
char textbuffer[16];
|
||||||
|
|
||||||
|
int arclenum = 0;
|
||||||
|
|
||||||
|
void display_mode(int mode, int height)
|
||||||
|
{
|
||||||
|
int pitch;
|
||||||
|
|
||||||
|
inreg.r[0] = 22;
|
||||||
|
_kernel_swi(OS_WriteC,&inreg,&outreg);
|
||||||
|
inreg.r[0] = mode;
|
||||||
|
_kernel_swi(OS_WriteC,&inreg,&outreg);
|
||||||
|
|
||||||
|
// I don't think we need these bits if we're not double buffering
|
||||||
|
#if 0
|
||||||
|
// Seems to make things work
|
||||||
|
inreg.r[0] = -1;
|
||||||
|
inreg.r[1] = 6;
|
||||||
|
_kernel_swi(OS_ReadModeVariable, &inreg, &outreg);
|
||||||
|
pitch = outreg.r[2];
|
||||||
|
|
||||||
|
inreg.r[0] = 2; /* Screen area */
|
||||||
|
_kernel_swi(OS_ReadDynamicArea, &inreg, &outreg);
|
||||||
|
inreg.r[1] = (pitch * height * 2) - outreg.r[1];
|
||||||
|
if (_kernel_swi(OS_ChangeDynamicArea, &inreg, &outreg) != NULL)
|
||||||
|
{
|
||||||
|
printf("Couldn't OS_ChangeDynamicArea\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadanswers(char* filename)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
inreg.r[0] = 5;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
|
||||||
|
length = outreg.r[4];
|
||||||
|
|
||||||
|
if(length > sizeof(answers))
|
||||||
|
{
|
||||||
|
printf("File exceeds %d bytes (%d bytes) object type is %d\n",sizeof(answers),length,outreg.r[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inreg.r[0] = 16;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
inreg.r[2] = (int) answers;
|
||||||
|
inreg.r[3] = 0;
|
||||||
|
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loaddict(char* filename)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
inreg.r[0] = 5;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
|
||||||
|
length = outreg.r[4];
|
||||||
|
|
||||||
|
if(length > sizeof(dict))
|
||||||
|
{
|
||||||
|
printf("File exceeds %d bytes (%d bytes) object type is %d\n",sizeof(dict),length,outreg.r[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inreg.r[0] = 16;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
inreg.r[2] = (int) dict;
|
||||||
|
inreg.r[3] = 0;
|
||||||
|
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadarclenum(char* filename)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
inreg.r[0] = 5;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
|
||||||
|
length = outreg.r[4];
|
||||||
|
|
||||||
|
if(length > sizeof(arclenum))
|
||||||
|
{
|
||||||
|
printf("File exceeds %d bytes (%d bytes) object type is %d\n",sizeof(arclenum),length,outreg.r[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inreg.r[0] = 16;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
inreg.r[2] = (int)&arclenum;
|
||||||
|
inreg.r[3] = 0;
|
||||||
|
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void savearclenum(char* filename)
|
||||||
|
{
|
||||||
|
inreg.r[0] = 10;
|
||||||
|
inreg.r[1] = (int) filename;
|
||||||
|
inreg.r[2] = 0xffd;
|
||||||
|
inreg.r[4] = (int)&arclenum;
|
||||||
|
inreg.r[5] = (int)&arclenum + (sizeof(arclenum));
|
||||||
|
|
||||||
|
_kernel_swi(OS_File,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int font_find(char* font, int height, int width)
|
||||||
|
{
|
||||||
|
inreg.r[0] = 0;
|
||||||
|
inreg.r[1] = (int) font;
|
||||||
|
inreg.r[2] = height*16;
|
||||||
|
inreg.r[3] = width*16;
|
||||||
|
inreg.r[4] = 0;
|
||||||
|
inreg.r[5] = 0;
|
||||||
|
_kernel_swi(Font_FindFont,&inreg,&outreg);
|
||||||
|
|
||||||
|
return outreg.r[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void font_colour(int fg, int bg, int fonthandle)
|
||||||
|
{
|
||||||
|
inreg.r[0] = fonthandle;
|
||||||
|
inreg.r[1] = bg;
|
||||||
|
inreg.r[2] = fg;
|
||||||
|
inreg.r[3] = 14;
|
||||||
|
_kernel_swi(ColourTrans_SetFontColours, &inreg, &outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_text(char* text, int x, int y, int fonthandle)
|
||||||
|
{
|
||||||
|
inreg.r[0] = fonthandle;
|
||||||
|
inreg.r[1] = (int) text;
|
||||||
|
inreg.r[2] = 1 << 4;
|
||||||
|
inreg.r[3] = x;
|
||||||
|
inreg.r[4] = y;
|
||||||
|
inreg.r[5] = 0;
|
||||||
|
inreg.r[6] = 0;
|
||||||
|
inreg.r[7] = 0;
|
||||||
|
_kernel_swi(Font_Paint,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void graphics_colour(int setcolour)
|
||||||
|
{
|
||||||
|
inreg.r[0] = setcolour;
|
||||||
|
inreg.r[1] = -1;
|
||||||
|
inreg.r[2] = 0;
|
||||||
|
_kernel_swi(ColourTrans_ReturnColourNumberForMode,&inreg,&outreg);
|
||||||
|
inreg.r[0] = 0;
|
||||||
|
inreg.r[1] = outreg.r[0];
|
||||||
|
_kernel_swi(OS_SetColour,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_line(int x1,int y1,int x2,int y2)
|
||||||
|
{
|
||||||
|
inreg.r[0] = 4;
|
||||||
|
inreg.r[1] = x1;
|
||||||
|
inreg.r[2] = y1;
|
||||||
|
_kernel_swi(OS_Plot,&inreg,&outreg);
|
||||||
|
inreg.r[0] = 5;
|
||||||
|
inreg.r[1] = x2;
|
||||||
|
inreg.r[2] = y2;
|
||||||
|
_kernel_swi(OS_Plot,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_rectangle(int x1,int y1,int x2,int y2)
|
||||||
|
{
|
||||||
|
draw_line(x1,y1,x1,y2);
|
||||||
|
draw_line(x1,y1,x2,y1);
|
||||||
|
draw_line(x2,y2,x2,y1);
|
||||||
|
draw_line(x2,y2,x1,y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_rectangle_filled(int x1,int y1,int x2,int y2)
|
||||||
|
{
|
||||||
|
inreg.r[0] = 96+4;
|
||||||
|
inreg.r[1] = x1;
|
||||||
|
inreg.r[2] = y1;
|
||||||
|
_kernel_swi(OS_Plot,&inreg,&outreg);
|
||||||
|
inreg.r[0] = 96+5;
|
||||||
|
inreg.r[1] = x2;
|
||||||
|
inreg.r[2] = y2;
|
||||||
|
_kernel_swi(OS_Plot,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int input_getchar()
|
||||||
|
{
|
||||||
|
_kernel_swi(OS_ReadC,&inreg,&outreg);
|
||||||
|
return outreg.r[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen_clear()
|
||||||
|
{
|
||||||
|
inreg.r[0] = 12;
|
||||||
|
_kernel_swi(OS_WriteC,&inreg,&outreg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int font = 0;
|
||||||
|
int boxx,boxy;
|
||||||
|
int i,guesslength;
|
||||||
|
char guess[6];
|
||||||
|
int finished = 0;
|
||||||
|
int dictmatch = 0;
|
||||||
|
int guessnum = 0;
|
||||||
|
int boxcolour = 0;
|
||||||
|
int greens = 0;
|
||||||
|
int usedguess[5] = {0,0,0,0,0};
|
||||||
|
|
||||||
|
display_mode(15,256);
|
||||||
|
|
||||||
|
printf("Loading dictionary...\n");
|
||||||
|
loaddict("dict");
|
||||||
|
printf("Loading answers...\n");
|
||||||
|
loadanswers("answers");
|
||||||
|
printf("Loading number...\n");
|
||||||
|
loadarclenum("arcnum");
|
||||||
|
|
||||||
|
screen_clear();
|
||||||
|
|
||||||
|
font = font_find("Corpus.Bold",32,20);
|
||||||
|
font_colour(0x00F00F00,0x00000000,font);
|
||||||
|
sprintf(textbuffer,"Arcle #%d",arclenum);
|
||||||
|
draw_text(textbuffer,25,900,font);
|
||||||
|
|
||||||
|
memset (guess,'\0',sizeof(guess));
|
||||||
|
|
||||||
|
for(boxx = 0; boxx < 5; boxx++)
|
||||||
|
{
|
||||||
|
for(boxy = 0; boxy < 6; boxy++)
|
||||||
|
{
|
||||||
|
graphics_colour(0xFFFFFF00);
|
||||||
|
draw_rectangle(25 + (boxx * 120),850 - (boxy * 120),125 + (boxx * 120),750 - (boxy * 120));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
font_colour(0xFFFFFF00,0x00000000,font);
|
||||||
|
sprintf(textbuffer,"Guess:");
|
||||||
|
draw_text(textbuffer,650,500,font);
|
||||||
|
|
||||||
|
for(i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
sprintf(textbuffer,"_");
|
||||||
|
draw_text(textbuffer,950 + (i * 60),500,font);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 1000;
|
||||||
|
guesslength = 0;
|
||||||
|
|
||||||
|
while(!finished)
|
||||||
|
{
|
||||||
|
char character;
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
character = input_getchar();
|
||||||
|
|
||||||
|
graphics_colour(0x00000000);
|
||||||
|
draw_rectangle_filled(650,375,1250,470);
|
||||||
|
|
||||||
|
if(character == 13)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(character == 8)
|
||||||
|
{
|
||||||
|
if(guesslength <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
guesslength--;
|
||||||
|
graphics_colour(0x00000000);
|
||||||
|
draw_rectangle_filled(945 + (guesslength * 60),440,950 + (guesslength * 60) + 50,560 + 50);
|
||||||
|
|
||||||
|
sprintf(textbuffer,"_");
|
||||||
|
draw_text(textbuffer,950 + (guesslength * 60),500,font);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(guesslength >= 5)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
guess[guesslength] = character;
|
||||||
|
|
||||||
|
graphics_colour(0x00000000);
|
||||||
|
draw_rectangle_filled(945 + (guesslength * 60),440,950 + (guesslength * 60) + 50,560 + 50);
|
||||||
|
|
||||||
|
sprintf(textbuffer,"%c",character);
|
||||||
|
draw_text(textbuffer,950 + (guesslength * 60),500,font);
|
||||||
|
|
||||||
|
guesslength++;
|
||||||
|
}
|
||||||
|
|
||||||
|
dictmatch = 0;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof(dict)/5; i++)
|
||||||
|
{
|
||||||
|
if(!memcmp(guess,dict + (i * 5),5))
|
||||||
|
{
|
||||||
|
dictmatch = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 5; i++)
|
||||||
|
usedguess[i] = 0;
|
||||||
|
|
||||||
|
if(!dictmatch)
|
||||||
|
{
|
||||||
|
font_colour(0x0000FF00,boxcolour,font);
|
||||||
|
sprintf(textbuffer,"Unknown word");
|
||||||
|
draw_text(textbuffer,650 ,400,font);
|
||||||
|
font_colour(0xFFFFFF00,boxcolour,font);
|
||||||
|
}else{
|
||||||
|
// Reset the guess input display
|
||||||
|
for(i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
graphics_colour(0x00000000);
|
||||||
|
draw_rectangle_filled(945 + (i * 60),440,950 + (i * 60) + 60,560 + 50);
|
||||||
|
sprintf(textbuffer,"_");
|
||||||
|
draw_text(textbuffer,950 + (i * 60),500,font);
|
||||||
|
}
|
||||||
|
|
||||||
|
boxy = guessnum;
|
||||||
|
|
||||||
|
for(boxx = 0; boxx < 5; boxx++)
|
||||||
|
{
|
||||||
|
if(guess[boxx] == answers[(5 * arclenum) + boxx])
|
||||||
|
{
|
||||||
|
boxcolour = 0x00FF0000;
|
||||||
|
greens++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Non-matches are grey by default
|
||||||
|
boxcolour = 0x44444400;
|
||||||
|
|
||||||
|
for(i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
if(guess[boxx] == answers[(5 * arclenum) + i]) // If we have another one
|
||||||
|
if(guess[i] != answers[(5 * arclenum) + i]) // Which isn't exact in itself
|
||||||
|
{
|
||||||
|
// Make sure we don't use the same letter twice for amber
|
||||||
|
// (for example TRUST guess for CLOTH should one one amber T)
|
||||||
|
if(usedguess[i] == 0)
|
||||||
|
{
|
||||||
|
boxcolour = 0x1EAEFC00;
|
||||||
|
usedguess[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics_colour(boxcolour);
|
||||||
|
draw_rectangle_filled(25 + (boxx * 120),850 - (boxy * 120),125 + (boxx * 120),750 - (boxy * 120));
|
||||||
|
|
||||||
|
graphics_colour(0xFFFFFF00);
|
||||||
|
draw_rectangle(25 + (boxx * 120),850 - (boxy * 120),125 + (boxx * 120),750 - (boxy * 120));
|
||||||
|
|
||||||
|
font_colour(0xFFFFFF00,boxcolour,font);
|
||||||
|
sprintf(textbuffer,"%c",guess[boxx]);
|
||||||
|
draw_text(textbuffer,25 + (boxx * 120) + 25,850 - (boxy * 120) - 65,font);
|
||||||
|
}
|
||||||
|
|
||||||
|
font_colour(0xFFFFFF00,0x00000000,font);
|
||||||
|
|
||||||
|
memset (guess,'\0',sizeof(guess));
|
||||||
|
guesslength = 0;
|
||||||
|
guessnum++;
|
||||||
|
if(greens >= 5)
|
||||||
|
finished = 1;
|
||||||
|
if(guessnum >= 6)
|
||||||
|
finished = 2;
|
||||||
|
greens = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics_colour(0x22222200);
|
||||||
|
draw_rectangle_filled(50,400,1200,700);
|
||||||
|
|
||||||
|
graphics_colour(0xFFFFFF00);
|
||||||
|
draw_rectangle(50,400,1200,700);
|
||||||
|
|
||||||
|
if(finished == 1)
|
||||||
|
{
|
||||||
|
font_colour(0xFFFFFF00,0x22222200,font);
|
||||||
|
sprintf(textbuffer,"Well done!");
|
||||||
|
draw_text(textbuffer,400,530,font);
|
||||||
|
arclenum++;
|
||||||
|
savearclenum("arcnum");
|
||||||
|
}else{
|
||||||
|
font_colour(0xFFFFFF00,0x22222200,font);
|
||||||
|
sprintf(textbuffer,"Better luck next time..");
|
||||||
|
draw_text(textbuffer,75,530,font);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
|||||||
|
!Arcle/c/* linguist-language=C
|
||||||
|
!Arcle/Makefile,fe1 linguist-language=Makefile
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
# Arcle
|
# Arcle
|
||||||
An implementation of Wordle for the Acorn Archimedes series
|
An implementation of Wordle for the Acorn Archimedes series.
|
||||||
|
|
||||||
|
Done using SWI calls as a challenge. Code is pretty messy, Sunday afternoon job and a hack-together from some old RiscOS stuff I've done.
|
||||||
|
|||||||
Reference in New Issue
Block a user