fix: ajout d'un id pour les niveaux et ajout du champs grid_orig qui correspond à la grille originale, corrections de bogues, ajout de grilles spéciales (last= dernière grille) sauvegarde automatique lors de la sortie des niveaux, dialogue modale qui prévient lors de l'application des préférences.

This commit is contained in:
Nicolas Hordé 2016-01-16 19:30:03 +01:00
parent 83026ed654
commit 0fda8ec977
6 changed files with 128 additions and 27 deletions

View File

@ -13,6 +13,7 @@ public class InitWorlds {
thelevels[0]=new Level(
0,
0,
(int)(Math.random()*Integer.MAX_VALUE),
"Introduction",
"Prise en main de l'interface de WireChem{#169} et amener l'électron neutre sur le senseur.",
"e0",
@ -38,6 +39,7 @@ public class InitWorlds {
thelevels[1]=new Level(
0,
1,
(int)(Math.random()*Integer.MAX_VALUE),
"Trajectoires",
"Comprendre les trajectoires empruntées par les électrons afin de mieux appréhender la conception de systèmes.",
"e0",
@ -63,6 +65,7 @@ public class InitWorlds {
thelevels[2]=new Level(
0,
2,
(int)(Math.random()*Integer.MAX_VALUE),
"Pistes",
"Utiliser des pistes afin de réaliser un circuit qui permet l'arrivée d'un électron neutre sur le senseur.",
"e0",
@ -89,6 +92,7 @@ public class InitWorlds {
thelevels[3]=new Level(
0,
3,
(int)(Math.random()*Integer.MAX_VALUE),
"Positiveur",
"Comprendre le fonctionnement de l'élément positiveur et générer 8 électrons positifs sur le senseur.",
"e+",
@ -114,6 +118,7 @@ public class InitWorlds {
thelevels[4]=new Level(
0,
4,
(int)(Math.random()*Integer.MAX_VALUE),
"Super-électrons",
"Générer 2 super-électrons negatifs par colision et les amener sur le senseur.",
"E-",
@ -139,6 +144,7 @@ public class InitWorlds {
thelevels[5]=new Level(
0,
5,
(int)(Math.random()*Integer.MAX_VALUE),
"Activation",
"L'objectif est de générer 6 électrons neutres et de découvrir les liaisons de fibres par lesquelles transitent les photons. Certains modifieurs nécessitent désormais l'activation par des photons.",
"e0",
@ -164,6 +170,7 @@ public class InitWorlds {
thelevels[6]=new Level(
0,
6,
(int)(Math.random()*Integer.MAX_VALUE),
"Fibres",
"A vous de dessiner votre infrastructure à base de fibres et de pistes mais aussi de modifieur activable afin de faire parvenir des éléctrons positifs et neutres sur les senseurs.",
"eX",
@ -190,6 +197,7 @@ public class InitWorlds {
thelevels[7]=new Level(
0,
7,
(int)(Math.random()*Integer.MAX_VALUE),
"Protons",
"Générer deux protons sur le senseur en utilisant un réacteur et un super-positron. Le réacteur est un élément qui nécessite l'activation.",
"p",
@ -215,6 +223,7 @@ public class InitWorlds {
thelevels[8]=new Level(
0,
8,
(int)(Math.random()*Integer.MAX_VALUE),
"Hydrogène",
"Générer le premier atome complet : l'hydrogène avec un proton et un électron négatif sur la couche K.",
"H",
@ -240,6 +249,7 @@ public class InitWorlds {
thelevels[9]=new Level(
1,
0,
(int)(Math.random()*Integer.MAX_VALUE),
"Deutérium",
"Générer le Deutérium, un isostope de l'hydrogène, celui-ci comporte un neutron en plus du proton et de l'électron négatif sur la couche K.",
"D",
@ -265,6 +275,7 @@ public class InitWorlds {
thelevels[10]=new Level(
1,
1,
(int)(Math.random()*Integer.MAX_VALUE),
"Tritium",
"Générer le second isostope de l'hydrogène : cet atome plus lourd que le Deutérium comporte alors deux neutrons, un proton ainsi qu'un électron négatif sur la couche K.",
"T",
@ -290,6 +301,7 @@ public class InitWorlds {
thelevels[11]=new Level(
1,
2,
(int)(Math.random()*Integer.MAX_VALUE),
"Hélium-4",
"L'isotope le plus courant de l'Hélium dans l'atmosphère terrestre est l'Hélium-4. Générer le en associant deux protons, deux neutrons et deux électrons négatifs sur la couche K.",
"He",
@ -315,6 +327,7 @@ public class InitWorlds {
thelevels[12]=new Level(
1,
3,
(int)(Math.random()*Integer.MAX_VALUE),
"Hélium-3",
"Générer le seul autre isotope stable de l'hélium, ce dernier n'étant présent qu'à l'état de traces sur Terre. Cet isotope comporte deux protons,un neutron et deux électrons négatifs sur la couche K.",
"He",
@ -340,6 +353,7 @@ public class InitWorlds {
thelevels[13]=new Level(
1,
4,
(int)(Math.random()*Integer.MAX_VALUE),
"Hélium-8",
"l'Hélium-8 est le plus étudié des isotopes lourds de l'Hélium avec l'Hélium-6. Cet isostope comporte deux protons, six neutrons et deux électrons négatifs sur la couche K.",
"He",
@ -365,6 +379,7 @@ public class InitWorlds {
thelevels[14]=new Level(
1,
5,
(int)(Math.random()*Integer.MAX_VALUE),
"Lithium",
"Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
"Li",
@ -390,6 +405,7 @@ public class InitWorlds {
thelevels[15]=new Level(
1,
6,
(int)(Math.random()*Integer.MAX_VALUE),
"Carbone",
"Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
"C",
@ -415,6 +431,7 @@ public class InitWorlds {
thelevels[16]=new Level(
1,
7,
(int)(Math.random()*Integer.MAX_VALUE),
"Oxygène",
"Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
"O",
@ -440,6 +457,7 @@ public class InitWorlds {
thelevels[17]=new Level(
1,
8,
(int)(Math.random()*Integer.MAX_VALUE),
"Néon",
"Générer le premier atome complet : l'hydrogène avec un proton et un électron négatif sur la couche K.",
"Ne",
@ -465,6 +483,7 @@ public class InitWorlds {
thelevels[18]=new Level(
2,
1,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",
@ -490,6 +509,7 @@ public class InitWorlds {
thelevels[19]=new Level(
2,
2,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",
@ -516,6 +536,7 @@ public class InitWorlds {
thelevels[20]=new Level(
3,
1,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",
@ -543,6 +564,7 @@ public class InitWorlds {
thelevels[21]=new Level(
3,
2,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",
@ -568,6 +590,7 @@ public class InitWorlds {
thelevels[22]=new Level(
4,
1,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",
@ -595,6 +618,7 @@ public class InitWorlds {
thelevels[23]=new Level(
4,
2,
(int)(Math.random()*Integer.MAX_VALUE),
"test",
"C'est un test.",
"e0",

View File

@ -6,15 +6,17 @@ public class Level implements Serializable{
public String Name;
public String Description;
public String Element;
public int[] Current;
public transient int[] Current;
public int[] Victory;
public int aWorld;
public int aLevel;
public int id;
public float X;
public float Y;
public int Tech;
public int Cout;
public Grid Grid;
public Grid Grid_orig;
public transient Grid Grid;
public int Cycle;
public int Temp;
public int Rayon;
@ -27,9 +29,10 @@ public class Level implements Serializable{
public String Tuto;
public int[][] Link;
public Level(int aWorld, int aLevel,String Name,String Description,String Element,int[] Current,int[] Victory,float X,float Y,int Tech,int Cout,Grid World,int Cycle,int Temp,int Rayon,int Nrj,int Maxcycle,int Maxtemp,int Maxrayon,int Maxnrj,String Tuto,boolean Special, int[][] Link){
public Level(int aWorld, int aLevel,int id,String Name,String Description,String Element,int[] Current,int[] Victory,float X,float Y,int Tech,int Cout,Grid World,int Cycle,int Temp,int Rayon,int Nrj,int Maxcycle,int Maxtemp,int Maxrayon,int Maxnrj,String Tuto,boolean Special, int[][] Link){
this.aWorld=aWorld;
this.aLevel=aLevel;
this.id=id;
this.Name=Name;
this.Description=Description;
this.Element=Element;
@ -40,6 +43,7 @@ public Level(int aWorld, int aLevel,String Name,String Description,String Elemen
this.Tech=Tech;
this.Cout=Cout;
this.Grid=World;
this.Grid_orig=World;
this.Cycle=Cycle;
this.Temp=Temp;
this.Rayon=Rayon;

View File

@ -66,6 +66,14 @@ public abstract class Base {
return null;
}
public Grid getGrid(int user,int level, String tag){
return null;
}
public boolean setGrid(int user,int level, String tag, Grid data){
return false;
}
public boolean setGrid(int user,int level, Grid data){
return false;
}

View File

@ -96,7 +96,7 @@ public class LocalBase extends Base {
creation = "create table if not exists stat (id integer)";
else if (model==datatype.userdata) {
dbHandler.execSQL("CREATE TABLE if not exists locks(date DATETIME DEFAULT CURRENT_TIMESTAMP, level INTEGER NOT NULL, user INTEGER NOT NULL, PRIMARY KEY(level,user));");
dbHandler.execSQL("CREATE TABLE if not exists grids(date DATETIME DEFAULT CURRENT_TIMESTAMP, level INTEGER NOT NULL, user INTEGER NOT NULL, object TEXT, PRIMARY KEY(level,user,date));");
dbHandler.execSQL("CREATE TABLE if not exists grids(date DATETIME DEFAULT CURRENT_TIMESTAMP, level INTEGER NOT NULL, user INTEGER NOT NULL, tag TEXT, object TEXT, PRIMARY KEY(level,user,date));");
dbHandler.execSQL("CREATE TABLE if not exists transmuters(date DATETIME DEFAULT CURRENT_TIMESTAMP, user INTEGER NOT NULL, object TEXT, PRIMARY KEY(user));");
dbHandler.execSQL("CREATE TABLE if not exists research(date DATETIME DEFAULT CURRENT_TIMESTAMP, user INTEGER NOT NULL, value INT, PRIMARY KEY(user));");
}
@ -132,9 +132,7 @@ public class LocalBase extends Base {
Level[] mc=null;
if (cursor.next())
try {
Gdx.app.debug(getClass().getSimpleName(),"TEST2");
byte[] bytes = Base64Coder.decodeLines(cursor.getString(0));
Gdx.app.debug(getClass().getSimpleName(),"TEST3");
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ins = new ObjectInputStream(bais);
mc=(Level[]) ins.readObject();
@ -264,7 +262,30 @@ public class LocalBase extends Base {
public Grid getGrid(int user,int level,int place){
DatabaseCursor cursor=null;
try {
cursor = dbHandler.rawQuery("select object from grids where user="+user+" and level="+level+" order by date desc limit "+place+",1;");
cursor = dbHandler.rawQuery("select object from grids where user="+user+" and level="+level+" and tag is null order by date desc limit "+place+",1;");
} catch (SQLiteGdxException e) {
return null;
}
Grid mc=null;
if (cursor.next())
try {
byte[] bytes = DatatypeConverter.parseBase64Binary(cursor.getString(0));
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ins = new ObjectInputStream(bais);
mc=(Grid) ins.readObject();
ins.close();
return mc;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Grid getGrid(int user,int level,String tag){
DatabaseCursor cursor=null;
try {
cursor = dbHandler.rawQuery("select object from grids where user="+user+" and level="+level+" and tag='"+tag+"' order by date desc limit 1;");
} catch (SQLiteGdxException e) {
return null;
}
@ -302,10 +323,32 @@ public class LocalBase extends Base {
return true;
}
public boolean setGrid(int user,int level, String tag, Grid data){
String encoded = "";
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(data);
oos.flush();
oos.close();
bos.close();
byte[] bytes = bos.toByteArray();
encoded = DatatypeConverter.printBase64Binary(bytes);
try {
dbHandler.rawQuery("delete from grids where user="+user+" and level="+level+" and tag='"+tag+"';");
} catch (Exception e) {}
dbHandler.rawQuery("insert into grids (user,level,tag,object) values ("+user+","+level+",'"+tag+"','"+encoded+"');");
return true;
}
catch (Exception e) {
return false;
}
}
public Array<String> getGrids(int user, int level){
DatabaseCursor cursor=null;
try {
cursor = dbHandler.rawQuery("select date from grids where level="+level+" and user="+user+" order by date desc;");
cursor = dbHandler.rawQuery("select date from grids where level="+level+" and user="+user+" and tag is null order by date desc;");
} catch (SQLiteGdxException e) {
return null;
}

View File

@ -64,7 +64,9 @@ import fr.evolving.renderers.LevelRenderer;
import fr.evolving.UI.ButtonLevel;
import fr.evolving.UI.Objectives;
import fr.evolving.UI.TouchMaptiles;
import fr.evolving.UI.WarnDialog;
import fr.evolving.assets.AssetLoader;
import fr.evolving.assets.InitWorlds;
import fr.evolving.assets.Preference;
import fr.evolving.automata.Level;
import fr.evolving.automata.Positiver_I;
@ -80,6 +82,7 @@ public class GameScreen implements Screen {
private InputMultiplexer multiplexer;
private Array<InputProcessor> processors;
private Timer ScrollTimer;
private WarnDialog dialog;
private TimerTask ScrollTask;
private Stage stage,stage_menu,stage_info,stage_tooltip;
private HorizontalGroup table;
@ -192,7 +195,21 @@ public class GameScreen implements Screen {
// This is the constructor, not the class declaration
public GameScreen(Level alevel) {
Gdx.app.debug(getClass().getSimpleName(),"Création des Barres verticales & horizontales");
this.level=alevel;
Gdx.app.debug(getClass().getSimpleName(),"Récupération des derniers niveaux.");
this.level.Grid=AssetLoader.Datahandler.user().getGrid(0, this.level.id, "LAST");
if (this.level.Grid==null) {
Gdx.app.debug(getClass().getSimpleName(),"Copie monde original.");
this.level.Grid=this.level.Grid_orig;
}
else
{
Gdx.app.debug(getClass().getSimpleName(),"Récupération de la dernière grille.");
this.level.Grid.tiling_copper();
this.level.Grid.tiling_transmuter();
}
Gdx.app.debug(getClass().getSimpleName(),"Création des Barres verticales & horizontales.");
table = new HorizontalGroup();
table.bottom().padLeft(5f).padBottom(8f).space(10f);
table2 = new VerticalGroup();
@ -208,7 +225,6 @@ public class GameScreen implements Screen {
stage_menu = new Stage(AssetLoader.viewport);
stage_info = new Stage(AssetLoader.viewport);
stage_tooltip = new Stage(AssetLoader.viewport);
this.level=alevel;
oldx=0;
oldy=0;
unroll=false;
@ -280,6 +296,17 @@ public class GameScreen implements Screen {
objectives.setPosition(890,AssetLoader.height-95);
buttonlevel=new ButtonLevel(level,true,1.0f);
buttonlevel.setPosition(1760,AssetLoader.height-125);
buttonlevel.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
Gdx.app.debug(getClass().getSimpleName(),"Remise à zéro du monde");
GameScreen.this.level.Grid=GameScreen.this.level.Grid_orig;
level.Grid.tiling_copper();
level.Grid.tiling_transmuter();
map.redraw(53);
buttonlevel.setChecked(false);
}
});
Gdx.app.debug(getClass().getSimpleName(),"Création de la barre d'information");
info_tech=new ImageTextButton("0",AssetLoader.Skin_level,"info_tech");
info_tech.setSize(48, 48);
@ -317,9 +344,11 @@ public class GameScreen implements Screen {
info_nom.setPosition(1230, AssetLoader.height-710);
info_desc=new TextArea("Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description", AssetLoader.Skin_level, "info_desc") ;
info_desc.setBounds(1220, AssetLoader.height-965, 575, 150);
dialog=new WarnDialog(AssetLoader.Skin_ui);
Gdx.app.debug(getClass().getSimpleName(),"Création d'une tilemap");
map=new TouchMaptiles(level,128,128);
map.setBounds(0, 0, AssetLoader.width, AssetLoader.height);
map.redraw(53);
map.addListener(new ActorGestureListener(){
@Override
public void zoom(InputEvent event, float initialDistance, float distance) {
@ -722,16 +751,18 @@ public class GameScreen implements Screen {
readsaved();
}
else if (caller.getName()=="save") {
AssetLoader.Datahandler.user().setGrid(0, level.aLevel, level.Grid);
AssetLoader.Datahandler.user().setGrid(0, level.id, level.Grid);
readsaved();
}
else if (caller.getName()=="levels") {
Gdx.app.debug("Barre","Affichage des niveaux.");
AssetLoader.Datahandler.user().setGrid(0, level.id, "LAST",this.level.Grid);
((Game)Gdx.app.getApplicationListener()).setScreen(new LevelScreen(level.aWorld));
}
else if (caller.getName()=="tree") {
}
else if (caller.getName()=="exits") {
AssetLoader.Datahandler.user().setGrid(0, level.id, "LAST",this.level.Grid);
Gdx.app.exit();
}
else if (caller.getName()=="screen") {
@ -927,7 +958,7 @@ public class GameScreen implements Screen {
selSaved.addListener(new ClickListener(){
public void clicked(InputEvent event, float x, float y) {
if (this.getTapCount()>1)
level.Grid=AssetLoader.Datahandler.user().getGrid(0, level.aLevel, selSaved.getSelectedIndex());
level.Grid=AssetLoader.Datahandler.user().getGrid(0, level.id, selSaved.getSelectedIndex());
level.Grid.tiling_copper();
level.Grid.tiling_transmuter();
map.redraw(53);
@ -939,8 +970,9 @@ public class GameScreen implements Screen {
}
public void readsaved() {
selSaved.setItems(AssetLoader.Datahandler.user().getGrids(0, level.aLevel));
Array<String> items=AssetLoader.Datahandler.user().getGrids(0, level.id);
if (items!=null)
selSaved.setItems(items);
}
public Table Createoption() {
@ -1098,6 +1130,7 @@ public class GameScreen implements Screen {
private void onSaveClicked() {
winOptions.setVisible(false);
writepref();
dialog.Show("Veuillez redémmarrer pour que les préférences soient appliquées.", stage);
}
private void onCancelClicked() {

View File

@ -84,7 +84,6 @@ public class LevelScreen implements Screen {
}
public void play() {
//thelevels= InitWorlds.go();
if (!AssetLoader.Datahandler.verifyall())
Gdx.app.debug(getClass().getSimpleName(),"Pilotes de bases de donnée défaillant.");
else
@ -94,6 +93,8 @@ public class LevelScreen implements Screen {
if (world<0)
world=0;
thelevels=AssetLoader.Datahandler.game().getworld(Preference.prefs.getString("world"));
/*thelevels= InitWorlds.go();
AssetLoader.Datahandler.game().setworld(thelevels,Preference.prefs.getString("world")); */
loadWorld(world);
Previous.setVisible(true);
Next.setVisible(true);
@ -492,19 +493,7 @@ public class LevelScreen implements Screen {
Worlddatalabel.setPosition(1480, 300);
Gamedata.setWorldlist(Worlddata);
Statdata.Refresh();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Userdata.Refresh();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Gamedata.Refresh();
Gdx.app.debug(getClass().getSimpleName(),"Affichage du menu.");
if (aworld!=-1)